模式动机
在面向对象设计中,如果一个对象会影响其他对象,同时也要被其他对象影响,那么我们可以称这两个对象为同事类(Colleague),同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,如下图:
此时,当其中一个对象发生变化时,与之关联的很多对象都会受到影响,可谓是“牵一发而动全身”。此时我们需要引入一个中介者,减少对象两两之间复杂的引用关系,使之成为一个松耦合的结构,如下图:
可以看到,之前复杂的网状结构在加入了中介者之后,变成了更简单清晰度的星型结构。这个中介者负责维护各个对象之间的引用关系。大大降低了耦合度。
模式定义
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
模式结构
抽象中介者:Mediator,定义接口用于各同事对象进行通信
具体中介者:ConcreteMediator
抽象同事者:Colleague,定义接口与中介者协作,通过中介者与其他同事进行通信
具体同事者:ConcreteColleague
代码示例
我们以单身男、单身女、媒人为例简单模拟一下中介者模式。单身男、单身女互为同事类,媒人相当于我们的中介者。
//抽象中介者
public abstract class Mediator {
public abstract void passMessage(SingleDog sender,String s);
}
//具体中介者-媒人,介绍人
public class MatchMaker extends Mediator{
@Override
public void passMessage(SingleDog sender,String s) {
System.out.println("媒人转达"+sender.getName()+"的话:"+s);
}
}
//抽象同事类-单身狗
public abstract class SingleDog {
protected Mediator mediator;
protected String name;
public abstract void say(String s);
public SingleDog(String name){
this.name = name;
}
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体同事类-单身男
public class SingleBoy extends SingleDog{
public SingleBoy(String name) {
super(name);
}
@Override
public void say(String s) {
mediator.passMessage(this,s);
}
}
//具体同事类-单身女
public class SingleGirl extends SingleDog{
public SingleGirl(String name) {
super(name);
}
@Override
public void say(String s) {
mediator.passMessage(this,s);
}
}
//客户端测试
public class Client {
public static void main(String[] args) {
Mediator mediator = new MatchMaker();
SingleDog girl = new SingleGirl("韩梅梅");
SingleDog boy = new SingleBoy("李雷");
girl.setMediator(mediator);
boy.setMediator(mediator);
girl.say("你有房么?");//媒人转达韩梅梅的话:你有房么?
boy.say("我有房!");//媒人转达李雷的话:我有房!
girl.say("你有车么?");//媒人转达韩梅梅的话:你有车么?
boy.say("我有车!");//媒人转达李雷的话:我有车!
girl.say("成交!");//媒人转达韩梅梅的话:成交!
boy.say("成交!");//媒人转达李雷的话:成交!
}
}
总结
中介者主要有如下两方面的作用:
中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。