中介对象可以封装一系列的对象交互,它可以使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在进行面向对象设计时,一般倾向于将系统分割成许多对象,这样可以增加复用性,但是这样做会导致对象的关系会非常复杂。中介者可以将这些集体行为封装起来,充当控制和协调这组对象交互的角色,从而使得这些对象之间不再有显式的相互引用,它们只知道中介者,从而减少了相互连接的数目。
中介者的优缺点很明显,例如它可以减少子类生成,降低各个Colleague之间的耦合度,简化对象协议,协作对象进行抽象,但是它使得控制集中,可能会导致Mediator难以维护。
在控制Colleague和Mediator之间的通信时,常用的方式有两种:一种是使用Observer模式,将Mediator实现为一个Observer,各个Colleague作为Subject,一旦状态改变就发通知给Mediator;另一种是在Mediator中定义一个特殊的通知接口,各个Colleague在通信时直接调用该接口。
public class Colleague {
private Mediator mediator = null;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public void changed() {
mediator.doChange(this);
}
}
public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void doJob1(){
System.out.println("Doing Job1...");
}
}
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void doJob2() {
System.out.println("Doing Job2...");
}
}
public interface Mediator {
public void initalState();
public void doChange(Colleague colleague);
public void show();
}
public class ConcreteMediator implements Mediator{
private ConcreteColleague1 colleague1 = null;
private ConcreteColleague2 colleague2 = null;
@Override
public void initalState() {
colleague1 = new ConcreteColleague1(this);
colleague2 = new ConcreteColleague2(this);
}
@Override
public void doChange(Colleague colleague) {
if(colleague == colleague1){
colleague1.doJob1();
System.out.println("Do other changes in mediator");
} else if(colleague == colleague2){
colleague2.doJob2();
}
}
@Override
public void show() {
colleague1.changed();
colleague2.changed();
}
}
public class Client {
@Test
public void test(){
Mediator mediator = new ConcreteMediator();
mediator.initalState();
mediator.show();
}
}
客户端只需要调用Mediator中的方法就可以控制整个系统,Mediator可以将Colleague协调起来,而且每个Colleague的实现类中都包含了对Mediator的引用,这样,当Colleague自身改变时也可以将改变的消息传递给Mediator,从而让Mediator管理所有的Colleague。
这种模式的好处在于它可以将复杂性封装在Mediator内部,并且消除了Colleague之间的依赖关系,但是当Mediator中控制变化的方法复杂性增加时,就会导致许多问题,并抵消这种模式在其他方面带来的好处。