定义
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
通过中介者模式,我们可以将复杂关系的网状结构变成结构简单的以中介者为核心的星形结构,每个对象不再和它与之关联的对象直接发生相互作用,而是通过中介者对象来另一个对象发生相互作用。
UML结构图
模式结构
- Mediator(抽象中介者): 定义了同事对象到中介者对象之间的接口
- ConcreteMediator(具体中介者): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
- Colleague(抽象同事类): 它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
- ConcreteColleague(具体同事类): 抽象同事类的子类;每个同事对象在与其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。
实例
在下面的例子中,同事A想要谈话,而同事B想要打架。当他们做一些动作时,他们会调用mediator来做到这一点。
代码实现
抽象中介者
public interface IMediator {
public void fight();
public void talk();
public void registerA(ColleagueA a);
public void registerB(ColleagueB a);
}
抽象同事类
public abstract class Colleague {
IMediator mediator;
public abstract void doSomething();
}
具体同事类:
//同时A
class ColleagueA extends Colleague {
public ColleagueA(IMediator mediator) {
this.mediator = mediator;
}
@Override
public void doSomething() {
this.mediator.talk();
this.mediator.registerA(this);
}
}
//同事B
class ColleagueB extends Colleague {
public ColleagueB(IMediator mediator) {
this.mediator = mediator;
this.mediator.registerB(this);
}
@Override
public void doSomething() {
this.mediator.fight();
}
}
中介
//concrete mediator
class ConcreteMediator implements IMediator{
//拥有两个同事的实例
ColleagueA talk;
ColleagueB fight;
public void registerA(ColleagueA a){
talk = a;
}
public void registerB(ColleagueB b){
fight = b;
}
//实现具体的方法
public void fight(){
System.out.println("Mediator is fighting");
//let the fight colleague do some stuff
}
public void talk(){
System.out.println("Mediator is talking");
//let the talk colleague do some stuff
}
}
测试代码
public class MediatorTest {
public static void main(String[] args) {
IMediator mediator = new ConcreteMediator();
ColleagueA talkColleague = new ColleagueA(mediator);
ColleagueB fightColleague = new ColleagueB(mediator);
talkColleague.doSomething();
fightColleague.doSomething();
}
}
运行结果:
Mediator is talking
Mediator is fighting
模式分析
中介者模式可以使对象之间的关系数量急剧减少。
- 中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
- 协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。
优点
- 简化了对象之间的交互。
- 将各同事解耦。
- 减少子类生成。
- 可以简化各同事类的设计和实现。
缺点
- 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。