调停者模式的意图:定义一个对象,封装一组对象的交互,从而降低对象之间的耦合度,避免对象之间的显示调用,并且可以独立的改变对象的行为
其UML图如下所示:
该模式包括如下角色:
Mediator:声明同事对象到调停者的接口,主要是一系列的事件方法,即Colleague中发生一个事件促使其去调用Mediator的对应方法
ConcreteMediator:用于聚合各个同事对象,同时实现Mediator中定义的方法用于同事之间的交互
Colleague:定义同事对象和调停者之间交互的接口,主要是获取调停者对象的方法
ConcreteColleague:具体同事类,主要实现自己的业务逻辑,当需要与其他同事类协调时,调用调停者,由调停者负责与其他同事类之间的通信
下面是一个实例:
// 同事类
class Colleague {
protected Mediator mediator;
public void setMediator(Mediator m){
mediator = m;
}
public Mediator getMediator(){
return mediator;
}
}
// 具体同事类
class ConcreteColleague1 extends Colleague{
public void operate(){
mediator.changed(this);
}
public void display(){
System.out.println("ConcreteColleague1.dispaly() is called");
}
}
// 具体同事类
class ConcreteColleague2 extends Colleague{
public void operate(){
mediator.changed(this);
}
public void display(){
System.out.println("ConcreteColleague2.display() is called");
}
}
// 调停者接口
interface Mediator {
public void changed(Colleague c);
}
// 调停者实现类
class ConcreteMediator implements Mediator {
private ConcreteColleague1 c1 = null;
private ConcreteColleague2 c2 = null;
public void setColleague1(ConcreteColleague1 c1){
this.c1 = c1;
}
public void setColleague2(ConcreteColleague2 c2){
this.c2 = c2;
}
@Override
public void changed(Colleague c) {
if(c instanceof ConcreteColleague1){
c2.display();
}else if (c instanceof ConcreteColleague2){
c1.display();
}
}
}
调停者模式的效果:
1.组件间的耦合度降低
2. 多对多的复杂模型变成一对多的简单模型
3. 组件间的交互集中控制