中介模式(Mediator)也称调停者模式,是一种比较简单的模式。
定义:
用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且独立地改变它们之间的交互。
抽象中介者类图如下:
中介者模式有以下4个角色:
- 抽象中介者(Mediator)角色:定义统一的接口,用于各同事角色之间的通信。
- 具体中介者(Concrete Mediator)角色:该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为。
- 抽象同事(Colleague)角色:该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象。
- 具体同事(Concrete Colleague)角色:该角色实现抽象同事类,每一个同事角色都知道中介者角色,且与其他同事角色通信时,一定要通过中介者角色协作。
Mediator.java
public abstract class Mediator { // 定义同事类 protected ConcreteColleague1 c1; protected ConcreteColleague2 c2; // 通过getter/setter方法注入同事类 protected ConcreteColleague1 getC1() { return c1; } protected void setC1(ConcreteColleague1 c1) { this.c1 = c1; } protected ConcreteColleague2 getC2() { return c2; } protected void setC2(ConcreteColleague2 c2) { this.c2 = c2; } // 中介者的业务逻辑 public abstract void doSomething1(); public abstract void doSomething2(); }
ConcreteMediator.java
public class ConcreteMediator extends Mediator { @Override public void doSomething1() { // 调用同事类的方法,只要是public方法都可以调用 super.c1.selfMethod1(); super.c2.selfMethod2(); } @Override public void doSomething2() { super.c1.selfMethod1(); super.c2.selfMethod2(); } }
Colleague.java
public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } }
ConcreteColleague1.java
public class ConcreteColleague1 extends Colleague { // 通过构造函数传递中介者 public ConcreteColleague1(Mediator mediator) { super(mediator); } // 自有方法 self-method public void selfMethod1() { } // 依赖方法 dep-method public void depMethod1() { // 处理自己的业务逻辑 // 自己不能处理的业务逻辑,委托给中介者处理 super.mediator.doSomething1(); } }
ConcreteColleague2.java
public class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super(mediator); } // 自有方法 self-method public void selfMethod2() { } // 依赖方法 dep-method public void depMethod2() { // 处理自己的业务逻辑 // 自己不能处理的业务逻辑,委托给中介者处理 super.mediator.doSomething2(); } }
优点:
- 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使得对象之间的关系更易维护和理解。
- 避免同事之间过度耦合,同事类只依赖中介者,使同事类更易被复用,中介类和同事类可以相互独立的演化。
- 中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。
缺点:
- 增加了中介者类的复杂性。
- 中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不能复用的。
注意事项:
- 不应在责任划分混乱时使用。责任分割的混乱会使系统中的对象与对象之间产生不适当的复杂关系。
- 不应当对数据类和方法类使用。
- 正确理解封装。封装首先是行为,以及行为所涉及的状态的封装。行为与状态是不应该分割开的。中介者模式的用途是管理很多对象的相互作用,以便使这些对象专注于自身行为。
引用:
青岛东合信息技术有限公司 . 设计模式(Java版) . 电子工业出版社,2012,142-146.
秦小波 . 设计模式之禅 . 机械工业出版社, 2014 , 254-256