相信自己,请一定要相信自己
上一章简单介绍了观察者模式(二十), 如果没有看过, 请观看上一章
一. 中介者模式
引用 菜鸟教程里面中介者模式介绍: https://www.runoob.com/design-pattern/mediator-pattern.html
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。
这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
中介者模式属于行为型模式
一.一 介绍
意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,
而且可以独立地改变它们之间的交互。
主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,
同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
何时使用: 多个类相互耦合,形成了网状结构。
如何解决: 将上述网状结构分离为星型结构。
关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。
应用实例:
1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
2、机场调度系统。
3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点: 中介者会庞大,变得复杂难以维护。
使用场景:
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项: 不应当在职责混乱的时候使用。
组成角色 | 具体 | 关系 |
抽象中介者(Mediator) | Mediator | 抽象中介者,定义了同事对象到中介者对象的接口 |
具体的中介者对象(ConcreteMediator) | ConcreteMediator | 抽象同事类 |
抽象同事类(Colleague) | Colleague | 抽象同事类 |
具体同事类(ConcreteColleague) | PhoneColleague,TVColleague | 具体的同事类,会有很多, 每个同事只知道自己的行为,而不了解其他同事类的行为(方法), 但 是他们都依赖中介者对象 |
二. 中介者模式实例
二.一 抽象同事类 Colleague
@Data
public abstract class Colleague {
private String name;
private Mediator mediator;
public Colleague (String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
public abstract void sendCmd(String cmd);
}
二.二 具体同事类实现
二.二.一 手机实现
@Slf4j
public class PhoneColleague extends Colleague{
public PhoneColleague(String name, Mediator mediator) {
super(name,mediator);
// 注册到中介集合里面。
mediator.register(name,this);
}
@Override
public void sendCmd(String cmd) {
getMediator().getCmdMessage(this.getName(),cmd);
}
public void call() {
log.info(">>> {} 打电话",super.getName());
}
public void wx() {
log.info(">>>>> {}打开微信",super.getName());
}
}
二.二.二 TV实现
@Slf4j
public class TVColleague extends Colleague{
public TVColleague (String name, Mediator mediator) {
super(name,mediator);
// 注册到中介集合里面。
mediator.register(name,this);
}
@Override
public void sendCmd(String cmd) {
getMediator().getCmdMessage(this.getName(),cmd);
}
public void on() {
log.info(">>> {} 开启电视",super.getName());
}
public void off() {
log.info(">>>>> {} 关闭电视",super.getName());
}
}
二.三 抽象中介者 Mediator
public interface Mediator {
void register (String name, Colleague colleague) ;
void getCmdMessage (String name, String cmd);
}
二.四 具体中介者 ConcreteMediator
public class ConcreteMediator implements Mediator{
private HashMap <String,Colleague> colleagueHashMap = new HashMap<>();
@Override
public void register(String name, Colleague colleague) {
colleagueHashMap.put(name,colleague);
}
@Override
public void getCmdMessage(String name, String cmd) {
// 根据名称,获取信息.
Colleague colleague = colleagueHashMap.get(name);
if (colleague == null) {
return ;
}
if (colleague instanceof TVColleague) {
// 是电视相应的
TVColleague tvColleague = (TVColleague) colleague;
if ("on".equals(cmd)){
tvColleague.on();
}else if ("off".equals(cmd)){
tvColleague.off();
}
}else if (colleague instanceof PhoneColleague) {
// 是电视相应的
PhoneColleague phoneColleague = (PhoneColleague) colleague;
if ("call".equals(cmd)){
phoneColleague.call();
}else if ("wx".equals(cmd)){
phoneColleague.wx();
}
}
}
}
二.五 客户端调用
@Test
public void oneTest(){
ConcreteMediator concreteMediator = new ConcreteMediator();
Colleague tv1 = new TVColleague("tv1",concreteMediator);
Colleague phone1 = new PhoneColleague("ph1",concreteMediator);
Colleague phone2 = new PhoneColleague("ph2",concreteMediator);
// 发送指令
tv1.sendCmd("on");
phone1.sendCmd("wx");
phone2.sendCmd("call");
}
优点:
1.多个类相互耦合,会形成网状结构, 使用中介者模式将网状结构分离为星型结构,进行解耦
- 减少类间依赖,降低了耦合,符合迪米特原则
缺点:
- 中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
- 如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意
本章节的代码放置在 github 上:
https://github.com/yuejianli/DesignPattern/tree/develop/Mediator
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!