中介者模式

分类专栏:
设计模式

文章标签:
设计模式
行为型模式
原创

中介者模式

用来降低多个对象和类之间的通信复杂性
提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护

使用步骤与意图

意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理
何时使用:多个类相互耦合,形成了网状结构
如何解决:将上述网状结构分离为星型结构
关键代码:对象 Colleague 之间的通信封装到一个类中单独处理

优缺点

优点:

1)降低了类的复杂度,将一对多转化成了一对一
2)各个类之间的解耦
3)符合迪米特原则

缺点:

中介者会庞大,变得复杂难以维护

迪米特法则

又叫作最少知识原则,一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解
迪米特法则可以简单说成:talk only to your immediate friends
对于OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系
迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达
因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度

实现

多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息
1.创建中介者类 ChatRoom 和 User类,User 对象使用 ChatRoom方法来分享他们的消息
public class ChatRoom {

   public static void showMessage(User user, String message){

      System.out.println(new Date().toString()
         + " [" + user.getName() +"] : " + message);
   }
}
public class User {
   private String name;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public User(String name){
      this.name  = name;
   }

   public void sendMessage(String message){
      ChatRoom.showMessage(this,message);
   }
}
2.MediatorDemo,我们的演示类使用 User 对象来显示他们之间的通信
public class MediatorDemo {

   public static void main(String[] args) {

      User robert = new User("Robert");
      User john = new User("John");

      robert.sendMessage("Hi! John!");
      john.sendMessage("Hello! Robert!");
   }
}
3.执行输出
Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!
  • 作者:潘震
  • 评论

    留言