设计模式之简单化_Mediator中介者模式_只有一个仲裁者
前言
博主github
博主个人博客http://blog.healerjean.com
1、解释
想象一个乱糟糟的开发小组的工作状态,组员之间虽然在一起协同工作,但是意见难以统一,总是相互指挥,导致工作进度滞后。这时候,就需要一个仲裁者。所有的组员将自己的情况汇报给仲裁者,仲裁者会从团队的整体考虑,然后下达指令。仲裁者负责统一大家的意见。这样,团队的交流过程就变成了组员向仲裁者报告,仲裁者向组员下达指令的形式,而组员之间不再询问和沟通,这就是Mediator模式。
2、实例代码
有3个设备,A设备操作要关闭B和C,通过仲裁者来进行操作,而不是他们之间互相调用,其他的大家也可以自己写
2.1、设备接口 Device
public abstract class Device {
public abstract void openDevice(String instruction, AbstractMediator abstractMediator);
public abstract void closeDevice(String instruction);
}
2.2、ADevice
public class ADevice extends Device{
@Override
public void openDevice(String instruction, AbstractMediator mediator) {
System.out.println("A设备正在"+instruction);
mediator.openA(instruction);
}
@Override
public void closeDevice(String instruction) {
System.out.println("A设备关闭");
}
}
2.3、BDevice
public class BDevice extends Device {
/**
* 操作该设备
*/
@Override
public void openDevice(String instruction, AbstractMediator abstractMediator) {
abstractMediator.openB(instruction);
}
@Override
public void closeDevice(String instruction) {
System.out.println("B设备关闭");
}
}
2.4、CDevice
public class CDevice extends Device {
@Override
public void openDevice(String instruction, AbstractMediator abstractMediator) {
abstractMediator.openC(instruction);
}
@Override
public void closeDevice(String instruction) {
System.out.println("C设备关闭");
}
}
2.5、仲裁者、中介者
public abstract class AbstractMediator {
/**
*保留所有设备的引用是为了当接收指令时可以唤醒其他设备的操作
*/
Device a , b , c;
public AbstractMediator(Device a, Device b, Device c) {
super();
this.a = a;
this.b = b;
this.c = c;
}
/**
* 定义操作属性
*/
public abstract void openA(String instruction);
public abstract void openB(String instruction);
public abstract void openC(String instruction);
}
2.6、仲裁者真正实现类
public class ConcreteAbstractMediator extends AbstractMediator {
public ConcreteAbstractMediator(Device a, Device b, Device c) {
super(a, b, c);
}
/**
* 开启A要关闭B和C
* @param instruction
*/
@Override
public void openA(String instruction) {
b.closeDevice(instruction);
c.closeDevice(instruction);
}
@Override
public void openB(String instruction) {
}
@Override
public void openC(String instruction) {
}
}
2.6、测试
public class Main {
public static void main(String[] args) {
Device a = new ADevice();
Device b = new BDevice();
Device c = new CDevice();
//把设备引用都保存在调停者中
AbstractMediator mediator=new ConcreteAbstractMediator(a , b ,c );
a.openDevice("开启",mediator);
}
}
A设备正在开启
B设备关闭
C设备关闭
3、总结
使用的时候,我可以在一些互相调用的场景中使用,有一些先后顺序执行的类可以使用该中介者模式,他们之间互相频繁的调用
3.1、缺点
- 如果涉及不好,引入中介者会使程序变的复杂
- 中介者承担过多责任,维护不好会出大事,合理使用回调(如果我们将closeDevice中传入仲裁者,这样又可以回调了)
感兴趣的,欢迎添加博主微信
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
微信 | 微信公众号 | 支付宝 |
---|---|---|