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

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

实现
抽象中介者角色,定义统一的接口,用于各同事角色之间的通信。
1 2 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(); }
|
具体中介者角色通过协调各同事角色实现协作行为,因为它必须依赖于各个同事角色。
1 2 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
同事角色,每个同事角色都知道中介者角色,而且与其他同事角色通信时,一定要通过中介者角色协作。
一种是同事本身的行为叫自发行为,比如改变对象本身的状态,处理自己的行为,与其他同事类或者中介者
第二种是依赖行为,必须依赖中介者才能完成的行为。
1 2 3 4 5 6
| public abstract class Colleague{ protected Mediator mediator; public Colleague(Mediator mediator){ this.mediator = mediator; } }
|
1 2 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的依赖关系。
媒体网关
中介服务