中介者模式(二十一)

news2024/11/27 12:44:33

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

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

一. 中介者模式

引用 菜鸟教程里面中介者模式介绍: 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具体的同事类,会有很多, 每个同事只知道自己的行为,而不了解其他同事类的行为(方法), 但 是他们都依赖中介者对象

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

paddlespeech http服务解决输出无符号

1.前情提要 下载paddlespeech官网代码并运行http服务进行中文识别时&#xff0c;会发现选择某些模型&#xff08;我用的是conformer_wenetspeech&#xff09;&#xff0c;是别的结果为一串文字&#xff0c;没有标点&#xff0c;效果如下&#xff1a; 经过调用padddlespeech相关…

【裸机开发】使用汇编清除 .bss 段

目录 1、为什么要清除 .bss 段 2、使用汇编清除 .bss 段 1、为什么要清除 .bss 段 .bss 段保存的是 未被初始化 或者 初始化为0 的全局/静态变量。在编译器看来&#xff0c;这些东西是多余的&#xff0c;实际并不会给他们分配空间。因此&#xff0c;编译生成目标文件的时候&…

38.SpringCloud—注册中心(eureka/nacos)、负载均衡Ribbon

目录 一、SpringCloud。 &#xff08;1&#xff09;认识微服务。 &#xff08;1.1&#xff09;单体架构与分布式架构&#xff08;微服务&#xff09;。 &#xff08;1.2&#xff09;微服务技术对比。 &#xff08;1.3&#xff09;SpringCloud。 &#xff08;2&#xff09…

linux创建静态库

创建一个目录&#xff0c;比如今天是6月13号&#xff0c;就mkdir 0613(创建目录0613),然后cd 0613&#xff08;进入0613目录&#xff09; 1.创建C语言库函数文件myheight.c vi myhight.c 2.创建C语言函数文件myweight.c vi myweight.c 3.创建C语言函数文件age.c vi myage.c 4…

代码审计-Java项目JDBCMybatisHibernate注入预编译写法

文章目录 Javaweb-数据库操作-模式&写法&预编译等环境搭建JDBC 注入分析关于预编译 Mybatis 注入分析Hibernate 注入分析总结&#xff1a; Javaweb-代码审计SQL注入-INXEDU在线网校 Javaweb-数据库操作-模式&写法&预编译等 环境搭建 VulDemo审计源码百度云 在…

深入理解深度学习——Transformer:解码器(Decoder)部分

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;Attention Mechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;Attention Mechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&…

微信小程序分享到微信,公众号h5分享到微信,微信小程序跳转h5页面

一&#xff1a;微信小程序分享到微信 1&#xff1a;需求 分享微信小程序中某个详情页&#xff0c;可以分享到群&#xff0c;个人&#xff0c;朋友圈&#xff0c;好友点击分享页&#xff0c;能跳转到对应详情页阅读。 2&#xff1a;分析问题 如何实现分享&#xff1f;分享时如…

Nvidia 3060显卡 CUDA环境搭建(Ubuntu22.04+Nvidia 510+Cuda11.6+cudnn8.8)

写在前面 工作中遇到&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对大…

【踩坑记录】STC8H8K64U硬件PWM使用小结

快速导航 写在前面库配置时钟配置GPIO配置定时器配置串口配置硬件PWM特殊功能同步功能 总结 写在前面 不出意外这是我第一次也是最后一次使用STC的芯片&#xff0c;写这篇博的目的纯粹记录下前段时间调试的痛苦经历&#xff0c;所有目前打算选或是已经开始调试这款芯片的朋友&…

Ubuntu16.04部署BEVformer 实时记录

一 配置依赖 a. Create a conda virtual environment and activate it. conda create -n open-mmlab python3.8 -y conda activate open-mmlabb. Install PyTorch and torchvision following the official instructions. pip install torch1.9.1cu111 torchvision0.10.1cu11…

【Linux】面试重点:死锁和生产消费模型原理

面试要点来了~ 文章目录 前言一、死锁的一系列问题二、生产者消费者模型原理总结 前言 上一篇的互斥量原理中我们讲解了锁的原理&#xff0c;我们知道每次线程申请锁的时候一旦申请成功这个线程自己就把锁带在自己身上了&#xff0c;这就保证了锁的原子性&#xff08;因为只有…

备忘录模式(二十二)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了中介者模式(二十一), 如果没有看过, 请观看上一章 一. 备忘录模式 引用 菜鸟教程里面备忘录模式介绍: https://www.runoob.com/design-pattern/memento-pattern.html 备忘录模式&#xff08;Memento Pattern&#xff…

基于Java单位人事管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

大面积无线WIFI覆盖 H3C WX3010E(AC+PoE三层交换机)+ H3C WA2620E、WA4320无线AP +华为USG6310S防火墙

一、适用场景&#xff1a; 1、跨复杂区域覆盖WIFI。支持多房间、多栋、多层复式楼、别墅、自建房的无线WIFI覆盖。 2、强大的漫游功能。楼上楼下移动使用WIFI时&#xff0c;需要支持WIFI的信号漫游&#xff0c;更换地理位置不掉线、不中断。 3、用户量或网络流量的负载均衡功…

IMX6ULL的官方SDK和官方BSP下载

买了块IMX6ULL的开发板&#xff0c;但是不想直接用开发板跟的程序&#xff0c;还有比如后面移植uboot和kernel的时候也想基于IMX6ULL官方的uboot和kernel做移植工作&#xff0c;所以自己先找一下怎么在官网下载这些东西。 1 官方SDK下载 百度搜索NXP官网&#xff0c;进去之后…

HotSpot虚拟机参数配置及优化

目录 一、JVM配置参数 二、GC回收日志分析 三、虚拟机性能监控和故障处理工具 1.命令工具 1)&#xff1a;基础工具 2)&#xff1a;性能监控和故障处理 2.可视化工具 四、JVM常出现问题 五、参考资料 一、JVM配置参数 HotSpot直到JDK9才提供统一的日志处理框架&#xff…

【k8s系列】使用MicroK8s 5分钟搭建k8s集群含踩坑经验

文章目录 MicrosK8s介绍版本选择准备三台虚拟机搭建MicroK8s环境安装Microk8s把当前用户加入Admin Group访问K8s启动和停止MicroK8s服务 搭建MicroK8s集群把Worker节点分别加入到MicroK8s集群在Master节点检查节点运行情况在Master节点打开存储插件在Master节点打开DNS插件查看…

低转速压榨,充分保留营养,用蓝宝原汁机每天轻享新鲜果汁

现在大家都特别重视健康&#xff0c;像是蔬菜、水果都是每天必需的&#xff0c;而且为了充分获取营养&#xff0c;很多人都会使用破壁机之类的工具&#xff0c;我觉得原汁机效果更好一些&#xff0c;它能够用慢速研磨技术来提取果汁&#xff0c;使用时不需要加水&#xff0c;能…

el-date-picker 结合dayjs 快速实现周选择、月选择,并设置控件的显示格式

目录 情况需求思路&#xff1a;使用el-date-picker 配置type属性&#xff0c;结合dayjsdayjs的安装以及常用api实现效果图 实现代码其他配置设置周选择控件显示一行为星期一 至 星期日 情况需求 在传递查询条件时&#xff0c;要求时间参数需要为 一周 或 一个月 思路&#xf…

系统移植 编译uboot和linux源码及驱动配置

写在前面&#xff1a;若是有些命令执行失败&#xff0c;前面添加sudo后再执行 目录 写在前面&#xff1a;若是有些命令执行失败&#xff0c;前面添加sudo后再执行 uboot源码获取和编译&#xff1a; Linux源码获取和编译 关于驱动配置 uboot源码获取和编译&#xff1a; 获…