中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式又称为调停者模式,它是一种对象行为型模式。
模式分析:1.在中介者模式中,通过引入中介者来简化对象之间的复杂交互。
2. 中介者模式是迪米特法则的一个典型应用。(迪米特法则(Law of Demeter,简称LOD),又称为“最少知识原则”,它的定义为:一个软件实体应当尽可能少的与其他实体发生相互作用。 这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易。)
3.对象之间多对多的复杂关系转化为相对简单的一对多关系。
模式结构:
Mediator: 抽象中介者 (中介者接口,声明了中介者向同事开放的各“事件通知”接口方法。)
ConcreteMediator: 具体中介者(具体中介者,实现了Mediator接口。在实现“事件通知”接口方法时,ConcreteMediator根据业务逻辑调用相应同事对象的对应方法。)
Colleague: 抽象同事类(同事接口,内部维护了中介者接口Mediator的实例。另外,如果采用消息转发的形式使用中介者,那么Colleegue还声明了各消息处理接口方法。)
ConcreteColleague: 具体同事类(具体同事类,实现了同事接口Colleegue。)
中介者作用:
中转作用(结构性):各个同事对象不再需要显式地引用其他同事,当需要和其他同事进行通信时,可通过中介者来实现间接调用。
协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。
代码示例
抽象中介者类示例代码
public abstract class Mediator {
protected ArrayList<Colleague> colleagues = new ArrayList<Colleague>(); //用于存储同事对象
//注册方法,用于增加同事对象
public void register(Colleague colleague) {
colleagues.add(colleague);
}
//声明抽象的业务方法
public abstract void operation();
具体中介者类示例代码
public class ConcreteMediator extends Mediator {
//实现业务方法,封装同事之间的调用
public void operation() {
......
((Colleague)(colleagues.get(0))).method1(); //通过中介者调用同事类的方法
......
}
}
抽象同事类示例代码
public abstract class Colleague {
protected Mediator mediator; //维持一个抽象中介者的引用
public Colleague(Mediator mediator) {
this.mediator=mediator;
}
public abstract void method1(); //声明自身方法,处理自己的行为
//定义依赖方法,与中介者进行通信
public void method2() {
mediator.operation();
}
}
具体同事类示例代码
public class ConcreteColleague extends Colleague {
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
//实现自身方法
public void method1() {
......
}
}
模式优缺点:
优点: 1. 简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多 交互,将原本难以理解的网状结构转换成相对简单的星型结构
2. 可将各同事对象解耦
3. 可以减少子类生成,中介者模式将原本分布于多个对象间的行为集中在一起,改变这些 行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须直接对同事类进 行扩展
缺点: 在具体中介者类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复 杂,使得系统难以维护
使用场景
系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解
一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象
想通过一个中间类来封装多个类中的行为,又不想生成太多的子类