中介者模式(Mediator Pattern)属于行为型模式,其用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
比如MVC模式,C(Controller控制器)是M(Mdel模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。
中介者涉及到的角色主要有四种:
Mediator:抽象中介者,定义了同事对象到中介者对象的接口
Colleague:抽象同时类
ConcreteMediator:具体的中介对象,实现抽象方法,需要知道所有的具体的同时类,即以一个集合来管理,并接收某个同事对象消息,完成相应的任务
ConcreteColleague:具体的同时类,会有很多,每个同事只知道自己的行为,而不了解其它同事类的行为,但是它们都依赖中介者对象
实际应用
直接看一个需求,在一个智能家庭中,包括各种设备,闹钟,咖啡机,电视机等,当要看电视时,各个设备可以协同工作,自动完成看电视的准备工作。
中介者相关代码
public abstract class Mediator {
//给中介者注册对象
public abstract void register(String colleagueName, Colleague colleague);
//接收具体同事对象发出的消息
public abstract void getMessage(int stateChange, String colleagueName);
public abstract void sendMessage();
}
class ConcreteMediator extends Mediator{
//集合放入所有同事对象
private HashMap<String, Colleague> colleagueHashMap;
private HashMap<String, String> interMap;
public ConcreteMediator(){
colleagueHashMap=new HashMap<>();
interMap=new HashMap<>();
}
@Override
public void register(String colleagueName, Colleague colleague) {
colleagueHashMap.put(colleagueName,colleague);
if (colleague instanceof Alarm){
interMap.put("Alarm",colleagueName);
}
}
@Override
public void getMessage(int stateChange, String colleagueName) {
if (colleagueHashMap.get(colleagueName) instanceof Alarm){
if (stateChange==0){
System.out.println("打开闹钟");
}else if (stateChange==1){
System.out.println("关闭闹钟");
}
}
}
@Override
public void sendMessage() {
}
}
同事类相关代码
public abstract class Colleague {
private Mediator mediator;
public String name;
public Colleague(Mediator mediator, String name){
this.mediator=mediator;
this.name=name;
}
public Mediator getMediator(){
return this.mediator;
}
public abstract void sendMessage(int stateChange);
}
class Alarm extends Colleague{
public Alarm(Mediator mediator, String name) {
super(mediator, name);
mediator.register(name,this);
}
public void sendAlarm(int stateChange){
sendMessage(stateChange);
}
@Override
public void sendMessage(int stateChange) {
this.getMediator().getMessage(stateChange,this.name);
}
}
客户端
public class Client {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
Alarm alarm = new Alarm(concreteMediator, "alarm");
alarm.sendMessage(0);
}
}
总结
当多个类相互耦合形成网状结构,使用中介者模式可将网状结构分离为星型结构,进行解耦,减少了类之间的依赖,符合迪米特法则。
但是中介者承担了较多的责任,一旦中介者出现问题,整个系统就会受到影响,因此要合理设计中介者,避免其过于复杂。
往期回顾
UML类图的六大关系
八种单例模式分析
由浅入深工厂模式
原型模式及深浅拷贝详解
建造者模式
适配器设计模式
桥接模式
外观模式
享元模式
史上最全代理模式讲解
模板方法
命令模式
访问者模式
迭代器模式
观察者模式
网友评论