定义
中介者模式(Mediator Pattern):定义一个对象来封装一系列对象的交互。中介者模式使各对象之间不需要显示地相互引用,从而使其耦合松散,而且用户可以独立地改变他们之间的交互。
结构
- Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。
- ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各同事对象的引用。
- Colleague(抽象同事类):它定义各个同事类共有的方法,并申明了一些抽象方法供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用与中介者通信。
- ConcreteColleague(具体同事类):它是抽象同事类的子类,每一个同事对象在需要和其他同事对象通信时先与中介者通信,通过中介者间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。
代码
Colleague
public abstract class Colleague {
// 维持一个抽象中介者的引用
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
// 自身方法,处理自己的行为
public abstract void method1();
// 定义依赖方法,与中介者进行通信
public void method2() {
mediator.operation();
}
}
ConcreteColleague
public class ConcreteColleague extends Colleague {
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
// 实现自身方法
@Override
public void method1() {
}
}
Mediator
import java.util.ArrayList;
import java.util.List;
public abstract class Mediator {
protected List<Colleague> colleagues = new ArrayList<>();
public void register(Colleague colleague) {
colleagues.add(colleague);
}
// 声明抽象的业务方法
public abstract void operation();
}
ConcreteMediator
public class ConcreteMediator extends Mediator {
@Override
public void operation() {
// 通过中介者调用同事类的方法
colleagues.get(0).method1();
}
}
Test
public class Test {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
Colleague colleague = new ConcreteColleague(mediator);
mediator.register(colleague);
mediator.operation();
}
}
优/缺点与适用环境
- 优点
- 中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互替代了原来同事之间的对最多交,一对多关系更容易理解、维护和扩展,将原来难以理解的网状结构转换成相对简单的星形结构。
- 可以将各同事对象解耦。中介者有利于各同事之间的松耦合,可以独立地改变和复用每一个同事和中介者,增加新的中介者类和新的同事类都比较方便,更好地符合开闭原则。
- 可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需要生成新的中介者子类即可。这使得各个同事类可以被重用,无须直接对同事类进行扩展。
- 缺点
- 在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
- 适用环境
- 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
- 一个对象由于引用了其他很对对象并且直接和这些对象通信,导致难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而且又不想生成太多的子类,此时可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则增加新的具体中介者类。