中介者模式将多对多的相互作用装化为一对多的相互作用,将系统从网状结构变成以调停者为中心的星型结构,达到降低系统的复杂性,提高可扩展性的作用。
1、定义
用一个中介者对象来封装一系列的对象交互。中介者使得各对象之间不必显示地相互引用,从而使他们松散耦合。
2、使用场景
如果一组对象之间的交互操作很多而且对象的行为操作相互依赖彼此时。可以采用中介者模式把这些对象的交互管理起来,各个对象只需要和中介者交互,从而使得各个对象松散偶耦合,结构清晰易懂。
3、UML图
4、示例代码
同事类
public abstract class Colleague {
//持有中介者对象,每个同事类都知道他的中介者对象
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
public void action() {
System.out.println("ConcreteColleagueA 有情况,通知中介者...");
mediator.changed(this);
}
}
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
public void action() {
System.out.println("执行 ConcreteColleagueB action 方法");
}
}
中介者类
public abstract class Mediator {
//同事对象在自身改变的时候来通知中介者的接口
//让中介者代为通知其他同事对象
public abstract void changed(Colleague colleague);
}
public class ConcreteMediator extends Mediator {
private ConcreteColleagueA colleagueA;
private ConcreteColleagueB colleagueB;
/**
* 收到某个同事对象的改变通知
*/
@Override
public void changed(Colleague colleague) {
System.out.println("中介者收到" + colleague.getClass().getSimpleName() + "的通知");
if(colleague == colleagueA) {
System.out.println("中介者调用ConcreteColleagueB action() 作下一步操作");
colleagueB.action();
}
}
public void setColleagueA(ConcreteColleagueA colleagueA) {
this.colleagueA = colleagueA;
}
public void setColleagueB(ConcreteColleagueB colleagueB) {
this.colleagueB = colleagueB;
}
}
客户端调用:
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
mediator.setColleagueA(colleagueA);
mediator.setColleagueB(colleagueB);
//同事对象A 执行动作
colleagueA.action();
}
}
调用结果:
中介者的目的是封装多个对象的交互,这些交互的处理多在中介者里面处理。
只要是实现了封装对象之间的交互功能,都可以应用中介者模式,而不必拘泥于中介者本身的结构。