中介者模式(二十一)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

相信自己请一定要相信自己

上一章简单介绍了观察者模式(二十), 如果没有看过, 请观看上一章

一. 中介者模式

引用 菜鸟教程里面中介者模式介绍: 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、想通过一个中间类来封装多个类中的行为而又不想生成太多的子类。

注意事项 不应当在职责混乱的时候使用。


组成角色具体关系
抽象中介者MediatorMediator抽象中介者,定义了同事对象到中介者对象的接口
具体的中介者对象ConcreteMediatorConcreteMediator抽象同事类
抽象同事类ColleagueColleague抽象同事类
具体同事类(ConcreteColleague)PhoneColleague,TVColleague具体的同事类会有很多, 每个同事只知道自己的行为而不了解其他同事类的行为(方法) 但 是他们都依赖中介者对象

image-20230615190357472

二. 中介者模式实例

二.一 抽象同事类 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");
    }

image-20230615191126214

优点:

1.多个类相互耦合会形成网状结构, 使用中介者模式将网状结构分离为星型结构进行解耦

  1. 减少类间依赖降低了耦合符合迪米特原则

缺点:

  1. 中介者承担了较多的责任一旦中介者出现了问题整个系统就会受到影响
  2. 如果设计不当中介者对象本身变得过于复杂这点在实际使用时要特别注意

本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Mediator


谢谢您的观看如果喜欢请关注我再次感谢 !!!

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6