现实生活中,常常会出现对象之间存在复杂的交互关系, 这种交互关系可能会出现网状结或者星形结构,如果将这种结构更改的话,会大大降低之间的耦合性, 这时只需要找个“中介者”就可以解决.
假如科技发达之后, 家里设备是智能化的,而小明有个习惯-洗澡,喜欢听歌,此时还要把窗帘拉上.
小明希望家里的洗浴设备,音响设备,窗帘设备能协同合作, 不管操作哪个设备,其他设备都可以响应.
现在很明显可以看出来, 有三个对象,也就是三种设备, 程序看起来也很简单, 只要打开了一种设备,然后再打开另外两个设备, 只要在一个设备的类放入另外两个设备的引用.
这个程序最主要的功能就是一个类里完成了对另外两个类的引用, 但是设计有两个主要缺陷:
解决上面的问题,引入了中介者模式
中介者(Mediator)模式: 定义一个中介对象来封装一系列对象的交互操作,使原有对象之间的耦合松散,以及独立之间的交互,中介者模式又叫做调停模式
2.2.1 优点
2.2.2 缺点
中介者模式的实现关键在于找出“中介者”
package mediator_12; public abstract class SmartDevice { //相关设备打开之后 使其进入准备状态 public abstract void readyState(String instruction); //操作该设备 public abstract void operateDevice(String instruction, SmartMediator mediator); }
package mediator_12; 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); } }
package mediator_12; 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); } }
package mediator_12; 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); } }
package mediator_12; 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); }
package mediator_12; 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); } }
package mediator_12; 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);//关闭音乐 } }
中介者模式封装了一系列对象交互, 中介者各对象不需要彼此联系引用对方相互作用, 从而耦合松散.达到了解藕的目的.
希望通过本篇博客,增深大家对中介者模式的理解,谢谢大家!!!
原文:https://www.cnblogs.com/guohai-stronger/p/12011875.html