Mediator模式也叫中介者模式,是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。
使用场景:
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及很多其他对象的行为,可使用中介者模式。
主要解决:
对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
应用实例:
1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
2、机场调度系统。
3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
中介者模式的UML模型:
角色和职责:
(1)Mediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。
(2)ConcreteMediator:具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
(3)Colleague:抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
(4)ConcreteColleague1、ConcreteColleague2:具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。
代码示例:
/**
* 定义中介者抽象类
* @author arain.liu
* 2018年4月3日 下午7:50:59
*/
public abstract class Mediator {
protected ConcreteColleagueA colleagueA;
protected ConcreteColleagueB colleagueB;
public ConcreteColleagueA getColleagueA() {
return colleagueA;
}
public void setColleagueA(ConcreteColleagueA colleagueA) {
this.colleagueA = colleagueA;
}
public ConcreteColleagueB getColleagueB() {
return colleagueB;
}
public void setColleagueB(ConcreteColleagueB colleagueB) {
this.colleagueB = colleagueB;
}
public abstract void do_workA();
public abstract void do_workB();
}
/**
* 定义中介者实现类
* @author arain.liu
* 2018年4月3日 下午7:52:04
*/
public class ConcreteMediator extends Mediator {
@Override
public void do_workA() {
System.out.println("ConcreteMediator执行do_workA");
super.colleagueA.doMethod1();
super.colleagueB.doMethod1();
}
@Override
public void do_workB() {
System.out.println("ConcreteMediator执行do_workB");
super.colleagueA.doMethod1();
super.colleagueB.doMethod1();
}
}
/**
* 抽象同事类
* @author arain.liu
* 2018年4月3日 下午7:54:28
*/
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public abstract void doMethod1();
public abstract void doMethod2();
}
/**
* @author arain.liu
* 2018年4月3日 下午7:55:15
*/
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
@Override
public void doMethod1() {
System.out.println("ConcreteColleagueA执行method1--");
}
@Override
public void doMethod2() {
System.out.println("ConcreteColleagueA执行method2--");
super.mediator.do_workA();
}
}
/**
* @author arain.liu
* 2018年4月3日 下午7:55:47
*/
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
@Override
public void doMethod1() {
System.out.println("ConcreteColleagueB执行method1***");
}
@Override
public void doMethod2() {
System.out.println("ConcreteColleagueB执行method2***");
super.mediator.do_workB();
}
}
/**
* @author arain.liu
* 2018年4月3日 下午8:13:40
*/
public class MainClass {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
mediator.setColleagueA(colleagueA);
mediator.setColleagueB(colleagueB);
System.out.println("**************************");
colleagueA.doMethod1();
System.out.println("**************************");
colleagueA.doMethod2();
System.out.println("**************************");
colleagueB.doMethod1();
System.out.println("**************************");
colleagueB.doMethod2();
}
}
运行结果:
中介者模式的优缺点:
优点:
(1)将系统按功能分割成更小的对象,符合类的最小设计原则
(2)对关联对象的集中控制
(3)减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则 ,而Mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)。
(4)有利于提高类的重用性
缺点:
中介者会庞大,变得复杂难以维护。