一、调停者模式的概念
调停者模式又名中介者模式,包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。
抽象调停者[Mediator]:定义出同事对象到调停者对象的接口,其中主要方法是一个(或多个)事件方法。
具体调停者[ConcreteMediator]:实现了抽象调停者所声明的事件方法。具体调停者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。
抽象同事类[Colleague]:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象。
具体同事类[ConcreteColleague]:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事交互。
二、调停者模式的实现
//抽象调停者
public abstract class Mediator{
public abstract void send(String message,Colleague colleague);
}
//抽象同事类
public abstract class Colleague{
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
}
//具体调停者
public class ConcreteMediator extends Mediator{
private ConcreteColleagueA colleagueA;
private ConcreteColleagueB colleagueB;
public void setConcreteColleagueA(ConcreteColleagueA colleagueA){
this.colleagueA = colleagueA;
}
public void setConcreteColleagueB(ConcreteColleagueB colleagueB){
this.colleagueB = colleagueB;
}
public void send(String message,Colleague colleague){
if(colleague == colleagueA){
colleagueB.notify(message)
}else{
colleagueA.notify(message)
}
}
}
//具体同事类A
public class ConcreteColleagueA extends Colleague{
public ConcreteColleagueA(Mediator mediator){
super(mediator);
}
public void send(String message){
this.metiator(message,this);
}
public void notify(String message){
System.out.println("ConcreteColleagueA received message: " + message);
}
}
//具体同事类B
public class ConcreteColleagueB extends Colleague{
public ConcreteColleagueB(Mediator mediator){
super(mediator);
}
public void send(String message){
this.metiator(message,this);
}
public void notify(String message){
System.out.println("ConcreteColleagueB received message: " + message);
}
}
public class Test{
public static void main(String[] args){
Mediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
mediator.setConcreteColleagueA(colleagueA);
mediator.setConcreteColleagueB(colleagueB);
colleagueA.send("你好!");
colleagueB.send("Hello!");
}
}
三、调停者模式的应用
调停者模式一般应用于一组对象以定义良好但复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多子类的场合。
四、调停者の其他问题
调停者模式通过把多个同事对象之间的交互封装到调停者对象里面,从而使得同事对象之间松散耦合
过度集中化,同事对象的交互非常多,而且比较复杂,会导致调停者对象变得十分复杂,而且难于管理和维护
五、Reference
六、Resource