中介者模式(Mediator Pattern)又称为调解者模式或调停者模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互,属于行为型模式,当某些对象之间的作用发送改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化,其核心思想是,通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发
应用场景
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解
- 交互的公共行为,如果需要改变行为则可以增加新的中介者类
角色
抽象中介者(Mediator):定义统一的接口,用于各同事角色之间的通信
具体中介者(ConcreteMediator):从具体的同事对象接收消息,向具体同事对象发出命令,协调各同事间的协作
抽象同事类(Colleague):每一个同事对象均需要依赖中介者角色,与其他同事间通信时,交由中介者进行转发协作
具体同事类(ConcreteColleague):负责实现自发行为(Self-Method),转发依赖方法(Dep-Method)交由中介者进行协作
代码实现
抽象中介者
public abstract class Mediator {
protected ConcreteColleagueA colleagueA;
protected ConcreteColleagueB colleagueB;
public void setColleageA(ConcreteColleagueA colleague) {
this.colleagueA = colleague;
}
public void setColleageB(ConcreteColleagueB colleague) {
this.colleagueB = colleague;
}
// 中介者业务逻辑
public abstract void transferA();
public abstract void transferB();
}
具体中介者
public class ConcreteMediator extends Mediator {
@Override
public void transferA() {
// 协调行为:A 转发到 B
this.colleagueB.selfMethodB();
}
@Override
public void transferB() {
// 协调行为:B 转发到 A
this.colleagueA.selfMethodA();
}
}
抽象同事类
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);
this.mediator.setColleageA(this);
}
// 自有方法:self-Method
public void selfMethodA() {
// 处理自己的逻辑
System.out.println(String.format("%s:self-Method", this.getClass().getSimpleName()));
}
// 依赖方法:dep-Method
public void depMethodA() {
// 处理自己的逻辑
System.out.println(String.format("%s:depMethod: delegate to Mediator", this.getClass().getSimpleName()));
// 无法处理的业务逻辑委托给中介者处理
this.mediator.transferA();
}
}
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
this.mediator.setColleageB(this);
}
// 自有方法:self-Method
public void selfMethodB() {
// 处理自己的逻辑
System.out.println(String.format("%s:self-Method", this.getClass().getSimpleName()));
}
// 依赖方法:dep-Method
public void depMethodB() {
// 处理自己的逻辑
System.out.println(String.format("%s:depMethod: delegate to Mediator", this.getClass().getSimpleName()));
// 无法处理的业务逻辑委托给中介者处理
this.mediator.transferB();
}
}
测试
public class Test {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
colleagueA.depMethodA();
System.out.println("-------------------------");
colleagueB.depMethodB();
}
}
优点
1、减少类间依赖,将多对多依赖转化成了一对多,降低了类间耦合
2、类间各司其职,符合迪米特法则
缺点
中介者模式中将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系,当同事类越多时,中介者就会臃肿,变得复杂且难以维护