中介者模式

主要为了降低模块内部之间类的相互引用,防止出现系统或者模块内部过度耦合。

中介者模式也叫调停者模式,一个对象要和N个对象交流特别混乱,这个时候加入一个中心,所有的类都和中心交流,这样就变成了星型拓扑结构。

星型拓扑结构

定义

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

中介者模式通用类图

实现

Mediator

抽象中介者角色,定义统一的接口,用于各同事角色之间的通信。

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();
}

Concrete Mediator

具体中介者角色通过协调各同事角色实现协作行为,因为它必须依赖于各个同事角色。

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的依赖关系。

媒体网关

中介服务