设计模式之中介者模式_动力节点Java学院整理

  

<强>定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
  

  

类型:行为类模式
  

  

类图:
  

  

设计模式之中介者模式_动力节点Java学院整理

  

<强>中介者模式的结构
  

  

中介者模式又称为调停者模式,从类图中看,共分三部为分:
  

  

抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。
  

  

中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。
  

  

同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂,并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。

  

<强>为什么要使用中介者模式
  

  

一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定,例如在下图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响。如果对象2发生变化,那么将会有5个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。
  

  

设计模式之中介者模式_动力节点Java学院整理”> <img src=

  

如果引入中介者模式,那么同事类之间的关系将变为星型结构,从图中可以看的到,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为。

  

设计模式之中介者模式_动力节点Java学院整理

  

我们使用一个例子来说明一下什么是同事类:有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是一个中类数字的100倍,也就是说,当修改类一个的数时,将这个数字乘100年以赋给类B,而修改类B时,要将数除100年以赋给类A类A类互相影响,就称为同事类。代码如下:
  

        抽象类AbstractColleague {   保护int数;      公共int getNumber () {   返回数量;   }      公共空间setNumber (int数){   这一点。数量=数量;   }//抽象方法,修改数字时同时修改关联对象   公共抽象空白setNumber (int数,AbstractColleague coll);   }      类ColleagueA延伸AbstractColleague {   公共空间setNumber (int数,AbstractColleague coll) {   这一点。数量=数量;   coll.setNumber(数量* 100);   }   }      类ColleagueB延伸AbstractColleague {      公共空间setNumber (int数,AbstractColleague coll) {   这一点。数量=数量;   coll.setNumber(数量/100);   }   }      公共类客户{   公共静态void main (String [] args) {      AbstractColleague阿胶=new ColleagueA ();   AbstractColleague collB=new ColleagueB ();      System.out.println(“==========设置一个影响B==========");   阿胶。collB setNumber (1288);   System.out.println(“阿胶的数量值:“+ collA.getNumber ());   System.out.println (“collB的数量值:“+ collB.getNumber ());      System.out.println(“==========设置B影响一个==========");   collB。阿胶setNumber (87635);   System.out.println (“collB的数量值:“+ collB.getNumber ());   System.out.println(“阿胶的数量值:“+ collA.getNumber ());   }   }   之前      

上面的代码中,类类B通过直接的关联发生关系,假如我们要使用中介者模式,A类B类之间则不可以直接关联,他们之间必须要通过一个中介者来达到关联的目的。

设计模式之中介者模式_动力节点Java学院整理