Mediator模式
应用场景
- 将对象间的交互和通信封装在一个类中,各个对象间的通信不必显式去声明和引用,大大降低了系统的复杂性能。
本质
- 封装交互
优点
- 将多对多的通信转化为一对多的通信,降低了系统的复杂性。
- Mediator还获得系统解耦的特性,降低了系统的耦合性,Mediator和各个Colleague就可以相互独立地修改了。
- 控制集中,集中的优点就是便于管理,符合单一职责原则
缺点
- 中介者的复杂性
角色
-
Mediator (仲裁者、中介者)
Mediator角色负责定义与Colleague角色进行通信和做出决定的接口(API)。 -
ConcreteMediator (具体的仲裁者、中介者)
CocreleMediator角色负贵实现Mediator角色的接口(API),负责实际做出决定。 -
Colleague (同事)
Colleague角色负责定义与Mediator角色进行通信的接口(API)。 -
ConcreteColleague(具体的同事)
ConcreteColleague阳色负费实观colo.角色的接口(API)。
Mediator模式的类图
示例程序
示例程序的类图
示例代码
public abstract class Mediator {
public abstract void send(String message,Colleague colleague);
}
public class ConcreteMediator extends Mediator {
private ColleagueImpl1 colleagueImpl1;
private ColleagueImpl2 colleagueImpl2;
public ColleagueImpl1 getColleagueImpl1() {
return colleagueImpl1;
}
public void setColleagueImpl1(ColleagueImpl1 colleagueImpl1) {
this.colleagueImpl1 = colleagueImpl1;
}
public ColleagueImpl2 getColleagueImpl2() {
return colleagueImpl2;
}
public void setColleagueImpl2(ColleagueImpl2 colleagueImpl2) {
this.colleagueImpl2 = colleagueImpl2;
}
@Override
public void send(String message, Colleague colleague) {
if (colleague instanceof ColleagueImpl1) {
colleagueImpl2.receiveMessage(message);
} else if (colleague instanceof ColleagueImpl2) {
colleagueImpl1.receiveMessage(message);
}
}
}
public abstract class Colleague {
protected Mediator mediator;
protected Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void send(String message);
public abstract void receiveMessage(String message);
}
public class ColleagueImpl1 extends Colleague {
ColleagueImpl1(Mediator mediator) {
super(mediator);
}
@Override
public void send(String message) {
mediator.send(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("收到1条消息:"+message);
}
}
public class Main {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
ColleagueImpl1 colleagueImpl1 = new ColleagueImpl1(concreteMediator);
ColleagueImpl2 colleagueImpl2 = new ColleagueImpl2(concreteMediator);
concreteMediator.setColleagueImpl1(colleagueImpl1);
concreteMediator.setColleagueImpl2(colleagueImpl2);
colleagueImpl1.send("吃过饭了吗?");
colleagueImpl2.send("没有呢,你打算请客? ");
}
}
拓展思路
- ConcreteColleague(具体的同事)可以复用,ConcreteMediator (具体的仲裁者、中介者)很难复用。
相关设计模式
-
Facade模式
在Mediator模式中,Mediator 角色与Colleague 角色进行交互。
而在Facade模式中,Facade 角色单方面地使用其他角色来对外提供高层接口(API)。
因此,可以说Mediator模式是双向的,而Facade模式是单向的。 -
Observer模式
有时会使用Observer根式来实现Mediator角色Colleague角色之间的通信。
满足的原则
- 单一职责原则