中介者模式(Mediator Pattern):也叫调停者模式,是一种比较简单的模式,用于管理很多的对象的相互作用,以至于使这些对象可以专注于自身的行为,中介者模式很容易在系统中使用,也很容易误用。
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之前的交互。
中介者模式的四个角色:
- 抽象中介者(Mediator)角色:定义同事对象到中介者对象的统一接口,用于各同事角色之间的通信
- 具体中介者(Concrete Mediator)角色:实现抽象中介者,依赖所有的具体同事
- 抽象同事(Colleague)角色:定义中介者对象到同事对象的统一接口,同事对象只知道中介者对象而不知道其他同事对象
- 具体同事(Concrete Colleague)角色:实现抽象同事,每个具体同事只知道自己在小范围的行为,而不知道大范围的目的
优点:减少了同事类之间的耦合,使任一个同事类都可以只专注于自身的行为,且不会影响到其他同事类,对各个同事类之间的交互通信进行了集中。
缺点:正是由于对所有同事类的集中管理,使得中介者类比任意一个具体同事类都要复杂。
中介者模式基础代码实现:
import java.util.Date;
public class MediatorModel {
/*
* 中介者模式
*/
public static void main(String[] args) {
//创建中介
ConcreteMediator mediator=new ConcreteMediator();
//将所有同事名单列出
Colleague A=new ConcreteColleagueA(mediator);
Colleague B=new ConcreteColleagueB(mediator);
//将同事名单告知中介
mediator.setColleagueA(A);
mediator.setColleagueB(B);
//同事向中介发送请求
A.sendToMediator("你好,我是你的同事A");
B.sendToMediator("你好,我是你的同事B");
}
}
//抽象中介者
abstract class Mediator{
//转发消息
public abstract void send(Colleague colleague,String msg);
}
//抽象同事
abstract class Colleague{
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator=mediator;
}
//发送消息
public void sendToMediator(String msg) {
mediator.send(this,msg);
}
//由具体同事处理接收到的消息
public abstract void receive(String msg);
}
//具体中介者
class ConcreteMediator extends Mediator{
//准备好所有具体同事的引用
private Colleague A;
private Colleague B;
//
public void setColleagueA(Colleague A) {
this.A=A;
}
public void setColleagueB(Colleague B) {
this.B=B;
}
@Override
public void send(Colleague colleague, String msg) {
Colleague tocolleague=null;
if(colleague==A) {
tocolleague=B;
}else if(colleague==B){
tocolleague=A;
}
System.out.println("日志:"+colleague.getClass()+" 发送一条消息给 "+tocolleague.getClass()+" 内容:"+msg+" 时间:"+(new Date()));
tocolleague.receive(msg);
}
}
//具体同事
class ConcreteColleagueA extends Colleague{
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
@Override
public void receive(String msg) {
System.out.println("A接收到一条消息:"+msg);
}
}
class ConcreteColleagueB extends Colleague{
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
@Override
public void receive(String msg) {
System.out.println("B接收到一条消息:"+msg);
}
}
运行结果:
日志:class com.nie.designmode.ConcreteColleagueA 发送一条消息给 class com.nie.designmode.ConcreteColleagueB 内容:你好,我是你的同事A 时间:Sat Oct 27 21:25:28 CST 2018
B接收到一条消息:你好,我是你的同事A
日志:class com.nie.designmode.ConcreteColleagueB 发送一条消息给 class com.nie.designmode.ConcreteColleagueA 内容:你好,我是你的同事B 时间:Sat Oct 27 21:25:28 CST 2018
A接收到一条消息:你好,我是你的同事B
参考资料:
《大话设计模式》——程杰
《设计模式(Java版)》