中介者模式
中介者模式是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用。
定义
用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
使用场景
- 一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他的很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
结构
实现
public abstract class Colleague {
protected Mediator mediator;
public Mediator getMediator() {
return mediator;
}
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void work();
}
public class ConcreteColleagueA extends Colleague{
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
public void work() {
System.out.println("ConcreteColleagueA's work");
}
}
public class ConcreteColleagueB extends Colleague{
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
public void work() {
System.out.println("ConcreteColleagueB's work");
}
}
public interface Mediator {
public void createMediator();
public void workAll();
}
public class ConcreteMediator implements Mediator{
private Colleague colleagueA;
private Colleague colleagueB;
public void createMediator() {
colleagueA = new ConcreteColleagueA(this);
colleagueB = new ConcreteColleagueB(this);
}
public void workAll() {
colleagueA.work();
colleagueB.work();
}
}
测试
public class Client {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
mediator.createMediator();
mediator.workAll();
}
}
测试结果:
ConcreteColleagueA’s work
ConcreteColleagueB’s work
如果没有Mediator类的话,ConcreteColleagueA 和ConcreteColleagueB之间的耦合程度就很高,修改个实现的代码,就要修改其他相关的引用,如果子类再多一点的话就变得很复杂了。利用中介者模式的话就可以把这些关联关系都放在中介里面来管理,改变其之间的交互也变得容易很多。