一、中介者模式介绍
①定义
是用来降低多个对象和类之间的通信复杂性。这种模式提供一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
②设计原则
高内聚、低耦合,使用中介者明显降低了对象之间的耦合;
③应用场景
当有多个对象彼此间相互交互的时候,自然就会想到对象间的耦合度过高,解决办法就是封装对象间的交互行为,因此就能想到中介者模式就是干这行的。
④优点
- 通过让对象彼此解耦,增加对象的复用性;
- 通过将控制逻辑集中,可以简化系统维护;
- 通过中介者使一对所变成一对一,便于理解;
⑤缺点
- 如果涉及不好,引入中介者会使程序变得复杂;
- 中介者承担过多责任,维护不好会出大事;
二、代码示例
假设现在科技发达之后,家里所有设备都是智能化的,而小明在家洗澡的时候有个习惯就是喜欢听歌,而且洗澡时候还要把窗帘拉上。因此就有这种情形,小明要拉窗帘可能就是要洗澡,当然也要听歌,因此我们希望小明家的洗浴设备,音响设备和窗帘设备都能协同合作,不管操作哪种设备,其他两种设备都有一定响应,以此写出程序。
//抽象类
public abstract class SmartDevice {
//相关设备打开之后 使其进入准备状态
public abstract void readyState(String instruction);
//操作该设备
public abstract void operateDevice(String instruction, SmartMediator mediator);
//窗帘设备
public class CurtainDevice extends SmartDevice{
public void operateDevice(String instruction,SmartMediator mediator) {
System.out.println("窗帘已"+instruction);//通过传入指令,打开或关闭窗帘
mediator.curtain(instruction);//窗帘通过中介者唤醒音乐设备和洗浴设备
}
public void readyState(String instruction) {
//如果其他设备开启则调用此方法,唤醒窗帘
System.out.println("窗帘设备准备"+instruction);
}
}
//音响设备
public class MusicDevice extends SmartDevice{
public void operateDevice(String instruction,SmartMediator mediator) {
System.out.println("音乐设备已"+instruction);
mediator.music(instruction);
}
public void readyState(String instruction) {
System.out.println("音乐设备准备"+instruction);
}
}
//洗浴设备
public class BathDevice extends SmartDevice{
public void operateDevice(String instruction, SmartMediator mediator) {
System.out.println("洗浴设备"+instruction);
mediator.bath(instruction);
}
public void readyState(String instruction) {
System.out.println("洗浴设备正在准备"+instruction);
}
}
//抽象中介者
public abstract class SmartMediator {
//保留所有设备的引用是为了当接收指令时可以唤醒其他设备的操作
SmartDevice bd;
SmartDevice md;
SmartDevice cd;
public SmartMediator(SmartDevice bd, SmartDevice md, SmartDevice cd) {
super();
this.bd = bd;
this.md = md;
this.cd = cd;
}
public abstract void music(String instruction);
public abstract void curtain(String instruction);
public abstract void bath(String instruction);
//具体中介者
public class ConcreteMediator extends SmartMediator{
public ConcreteMediator(SmartDevice bd, SmartDevice cd, SmartDevice md) {
super(bd, cd, md);
}
public void music(String instruction) {//音乐被唤醒后,使其他设备进入准备状态
cd.readyState(instruction);//调用窗帘的准备方法
bd.readyState(instruction);//调用洗浴设备的准备方法
}
public void curtain(String instruction) {
md.readyState(instruction);
bd.readyState(instruction);
}
public void bath(String instruction) {
cd.readyState(instruction);
md.readyState(instruction);
}
}
//客户端
public class Client {
public static void main(String[] args) {
SmartDevice bd=new BathDevice();
SmartDevice cd=new CurtainDevice();
SmartDevice md=new MusicDevice();
SmartMediator sm=new ConcreteMediator(bd, cd, md);//把设备引用都保存在调停者中
cd.operateDevice("open",sm); //开启窗帘
md.operateDevice("close",sm);//关闭音乐
}
}