中介者模式
主要为了降低模块内部之间类的相互引用,防止出现系统或者模块内部过度耦合。
中介者模式也叫调停者模式,一个对象要和N个对象交流特别混乱,这个时候加入一个中心,所有的类都和中心交流,这样就变成了星型拓扑结构。

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

实现
抽象中介者角色,定义统一的接口,用于各同事角色之间的通信。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | public abstract class Mediator{protected ConcreteColleague1 c1;
 protected ConcreteColleague2 c2;
 public ConcreteColleague1 getC1(){ return c1;}
 public ConcreteColleague2 getC2(){ return c2;}
 public void setC1(ConcreteColleague1 c1){
 this.c1 = c1;
 }
 public void setC2(ConcreteColleague2 c2){
 this.c2 = c2;
 }
 
 public abstract void doSomething1();
 public abstract void doSomething2();
 }
 
 | 
具体中介者角色通过协调各同事角色实现协作行为,因为它必须依赖于各个同事角色。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | public class ConcreteMediator extends Mediator{public void doSomething1(){
 super.c1.selfMethod1();
 super.c2.selfMethod2();
 }
 public void doSomething2(){
 super.c1.selfMethod1();
 super.c2.selfMethod2();
 }
 }
 
 | 
Colleague
同事角色,每个同事角色都知道中介者角色,而且与其他同事角色通信时,一定要通过中介者角色协作。
一种是同事本身的行为叫自发行为,比如改变对象本身的状态,处理自己的行为,与其他同事类或者中介者
第二种是依赖行为,必须依赖中介者才能完成的行为。
| 12
 3
 4
 5
 6
 
 | public abstract class Colleague{protected Mediator mediator;
 public Colleague(Mediator mediator){
 this.mediator = mediator;
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | public class ConcreteColleague1 extends Colleague{public ConcreteColleague1(Mediator mediator){
 super(mediator);
 }
 
 public void selfMethod1(){
 
 }
 
 public void depMethod1(){
 super.mediator.doSomething1();
 }
 }
 
 public class ConcreteColleague2 extends Colleague{
 public ConcreteColleague2(Mediator mediator){
 super(mediator);
 }
 
 public void selfMethod1(){
 
 }
 
 public void depMethod1(){
 super.mediator.doSomething1();
 }
 }
 
 | 
应用
优点
减少类之间的依赖,把原有的一对多的依赖变成了一对一的依赖,同事类只依赖中介者,减少了依赖,同时降低了类之间的耦合。
缺点
中介者模式的缺点是中介者会膨胀,而且逻辑复杂,原本N个对象直接的相互依赖关系转换为中介者和同事类的依赖关系,同事类越多,中介者的逻辑就越复杂。
应用
机场调度中心
每一架飞机都和机场调度中心保持联系。
MVC框架
Controller做为一个中介者,把Model和View隔离开,协调MV协同工作,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少MV的依赖关系。
媒体网关
中介服务