中介者模式(二十一)

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

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

一. 中介者模式

引用 菜鸟教程里面中介者模式介绍: https://www.runoob.com/design-pattern/mediator-pattern.html

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。

这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

中介者模式属于行为型模式

一.一 介绍

意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,
而且可以独立地改变它们之间的交互。

主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,
同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用: 多个类相互耦合,形成了网状结构。

如何解决: 将上述网状结构分离为星型结构。

关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。

扫描二维码关注公众号,回复: 15540050 查看本文章

应用实例:
1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
2、机场调度系统。
3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点: 中介者会庞大,变得复杂难以维护。

使用场景:
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

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


组成角色 具体 关系
抽象中介者(Mediator) Mediator 抽象中介者,定义了同事对象到中介者对象的接口
具体的中介者对象(ConcreteMediator) ConcreteMediator 抽象同事类
抽象同事类(Colleague) Colleague 抽象同事类
具体同事类(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


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

猜你喜欢

转载自blog.csdn.net/yjltx1234csdn/article/details/131234310