【设计模式】第二十二章:中介者模式详解及应用案例

news2024/10/7 14:26:50

系列文章

【设计模式】七大设计原则
【设计模式】第一章:单例模式
【设计模式】第二章:工厂模式
【设计模式】第三章:建造者模式
【设计模式】第四章:原型模式
【设计模式】第五章:适配器模式
【设计模式】第六章:装饰器模式
【设计模式】第七章:代理模式
【设计模式】第八章:桥接模式
【设计模式】第九章:外观模式 / 门面模式
【设计模式】第十章:组合模式
【设计模式】第十一章:享元模式
【设计模式】第十二章:观察者模式
【设计模式】第十三章:模板方法模式
【设计模式】第十四章:策略模式
【设计模式】第十五章:责任链模式
【设计模式】第十六章:迭代器模式
【设计模式】第十七章:状态模式
【设计模式】第十八章:备忘录模式
【设计模式】第十九章:访问者模式
【设计模式】第二十章:解释器模式
【设计模式】第二十一章:命令模式
【设计模式】第二十二章:中介者模式


文章目录

  • 系列文章
  • 中介者模式
  • 一、定义
  • 二、角色分类
  • 三、实现方式
    • UML图
    • 具体实现
  • 四、应用场景
  • 五、优缺点
    • 优点
    • 缺点


中介者模式

一、定义

摘自百度百科: 用一个中介对象来封装一系列对象的交互,从而把一批原来可能是交互关系复杂的对象转换成一组松散耦合的中间对象,以有利于维护和修改。


二、角色分类

抽象中介者(Mediator)

声明了同时对象到中介者对象的接口

具体中介者(Concrete Mediator)

其为具体中介者的子类,从具体的同事对象接收消息,向具体同事发出命令

抽象同事角色(Colleague)

声明了中介者对象接口,它只知道中介者对象,而不知道其他同事对象

具体同事角色(Concrete Colleague)

其为抽象同事的子类,每个具体同事类都知道自己在小范围内的行为,而不知道其在大范围内的目的

客户角色(Client)

具体调用方法的角色


三、实现方式

UML图

在这里插入图片描述

具体实现

抽象中介者(Mediator)

public abstract class Mediator {
  protected ConcreteColleagueA colleagueA;
  protected ConcreteColleagueB colleagueB;

  public void setColleagueA(ConcreteColleagueA colleague) {
    this.colleagueA = colleague;
  }

  public void setColleagueB(ConcreteColleagueB colleague) {
    this.colleagueB = colleague;
  }

  public abstract void transferA();

  public abstract void transferB();
}

具体中介者(Concrete Mediator)

public class ConcreteMediator extends Mediator {
  /**
   * 由具体同事A,向具体同事B发出指令
   */
  @Override
  public void transferA() {
    this.colleagueB.selfMethodB();
  }

  /**
   * 由具体同事B,向具体同事A发出指令
   */
  @Override
  public void transferB() {
    this.colleagueA.selfMethodA();
  }
}

抽象同事类(Colleague)

public abstract class Colleague {
  protected Mediator mediator;

  public Colleague(Mediator mediator) {
    this.mediator = mediator;
  }
}

具体同事类(Concrete Colleague)

public class ConcreteColleagueA extends Colleague {
  public ConcreteColleagueA(Mediator mediator) {
    super(mediator);
    this.mediator.setColleagfueA(this);
  }

  /**
   * 自有方法
   */
  public void selfMethodA() {
    System.out.println("同事A收到中介协作通知")
  }

  /**
   * 依赖方法
   */
  public void depMethodA() {
    System.out.println(this.getClass().getSimpleName()+ " depMethodA通知中介者进行转发协作")
  }
}
public class ConcreteColleagueB extends Colleague {
  public ConcreteColleagueB(Mediator mediator) {
    super(mediator);
    this.mediator.setColleageB(this);
  }

  /**
   * 自有方法
   */
  public void selfMethodB() {
    System.out.println("同事B收到中介协作通知");
  }

  /**
   * 依赖方法
   */
  public void depMethodB() {
    System.out.println(this.getClass().getSimpleName() + " depMethodB通知中介者进行转发协作");
    // 中介者进行转发协作
    this.mediator.transferB();
  }
}

客户角色(Client)

public class Client {
  public static void main(String[] args) {
    // 创建抽象中介者
    Mediator mediator = new ConcreteMediator();
    // 具体同事类
    ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
    ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
    // 中介者进行转发协作,A转发给B
    colleagueA.depMethodA();
    System.out.println("-------------------------");
    // 中介者进行转发协作,B转发给A
    colleagueB.depMethodB();
  }
}

运行结果

ConcreteColleagueA depMethodA通知中介者进行转发协作
同事B收到中介协作通知
-------------------------
ConcreteColleagueB depMethodB通知中介者进行转发协作
同事A收到中介协作通知

四、应用场景

以下部分内容摘自菜鸟教程

意图: 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

主要解决: 对于一些固定文法构建一个解释句子的解释器。

何时使用: 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

如何解决: 构建语法树,定义终结符与非终结符。

关键代码: 构建环境类,包含解释器之外的一些全局信息,一般是 HashMap。

应用实例: 编译器、运算表达式计算。

使用场景:

  1. 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  2. 一些重复出现的问题可以用一种简单的语言来进行表达。
  3. 一个简单语法需要解释的场景。

注意事项: 可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替。


五、优缺点

优点

  1. 可扩展性比较好,灵活。
  2. 增加了新的解释表达式的方式。
  3. 易于实现简单文法。

缺点

  1. 可利用场景比较少。
  2. 对于复杂的文法比较难维护。
  3. 解释器模式会引起类膨胀。
  4. 解释器模式采用递归调用方法。

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

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

相关文章

怎么用迅捷视频转换器将MP4格式视频转成AVI格式

我们平时看视频的时候,会发现视频都有不同的格式,例如MP4、AVI、MKV等等。其中AVI是一种音频视频交错格式,就是可以将视频和音频交织在一起进行同步播放,这种视频格式的优点是可以跨多个平台使用,在日常生活和工作中&a…

CSDN创作常用操作说明

CSDN创作 目录标题文本样式列表图片连接代码表格UML图Mermaid流程图Flowchart流程图classDiagram类图快捷键 目录 创建目录的方式: [TOC](目录)标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题文本样式 **加粗文本** ~…

NDK编译ffmpeg包含硬件加速vulkan和mediacodec

NDK编译ffmpeg包含硬件加速vulkan和mediacodec flyfish ffmpeg:ffmpeg-6.0 NDK:android-ndk-r25c 硬件加速:vulkan 和 mediacodec target CPU:armv8-a host:Ubuntu 22.04 因为这里要编译硬件加速版本的ffmpeg-6.0&a…

微服务学习2——利用nacos实现服务治理

(本文参考黑马程序员项目) 个人仓库地址:https://gitee.com/jkangle/springboot-exercise.git 1.当前项目中存在的问题 不同微服务之间的调用通过硬编码的形式,这样可能在需要打量修改的时候出现问题,因此引入了服务…

新版Grafana仪表盘

一 Grafana 是什么 Grafana 是一个开源的指标量监测和可视化工具,常用于展示基础设施的时序数据和应用 程序运行分析。 官网指路: https://grafana.com/ 与前文相关的两个概念: 1)数据源(Datasource)&…

Xcode 15 beta 3 (15A5195k) 发布下载 - Apple 平台 IDE

Xcode 15 beta 3 (15A5195k) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布) 7 月 5 日(北京时间今日凌晨)已发布。 IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接:https://sysin.org/blog/apple-xcode-15/&#xf…

macOS Sonoma 14 beta 3 (23A5286g) ISO、IPSW、PKG 下载

macOS Sonoma 14 beta 3 (23A5286g) ISO、IPSW、PKG 下载,7 月 5 日(北京时间今日凌晨)已发布 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安…

【PyQt5】构建强大的Python图形用户界面应用程序 -- 入门指南

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

微服务学习3——利用sentinel实现服务器的容错

1.Sentinel服务器容错 (本文参考黑马程序员项目) 个人仓库地址:https://gitee.com/jkangle/springboot-exercise.git 在服务器中,由于网络原因可能会出现线程阻塞的情况,当线程阻塞的时候如果有大量的请求涌入&#x…

echarts滚动条样式修改

1.修改的样式如下: 2.相关代码 // 基于准备好的dom,初始化echarts实例 const myChart echarts.init(this.$refs.tasksChart) // 绘制图表 myChart.setOption({grid: {top: 4%,left: 12%,right: 4%,bottom: 23%},// tooltip: {// formatter: {b} {c…

【ElasticSearch】JavaRestClient实现索引库和文档的增删改查

文章目录 一、RestClient1、什么是RestClient2、导入demo工程3、数据结构分析与索引库创建4、初始化JavaRestClient 二、RestClient操作索引库1、创建索引库2、删除索引库3、判断索引库是否存在 三、RestClient操作文档1、新增文档2、查询文档3、删除文档4、修改文档5、批量导入…

视觉SLAM-光流法

文章目录 目录 前言 🌟光流法的基本原理 🌟OpenCV中的光流法实现 🌟光流法的应用 🌟代码实现 🍉OpenCV代码 🍉OpenCV代码 🌟总结 前言 当我们观察一个视频或连续帧的图像时&#xff0c…

【Bubbliiiing视频记录】Pytorch 搭建自己的Unet语义分割平台

来源 b站 地址 什么是语义分割 语义分割:对图像每个像素点进行分类 常见神经网络处理过程:Encoder提取特征,接着Docoder恢复成原图大小的图片 UNet整体结构 分为三个部分 主干特征提取部分: 卷积和最大池化的堆叠获得五个初…

Snail-Camunda

gitee地址:snail-camunda 当前版本:V1.0 💖💖💖希望大家动动发财的小手帮忙star一下,感谢! ⭐项目介绍 本项目是对Camunda接口…

data和filter协议文件包含

实验目的 通过本实验,了解php封装伪协议,掌握filter协议和data协议的用法 实验环境 操作机:kali 靶机:Windows Server 2003 实验地址:http://靶机ip/exp/include2/filter/ http://靶机ip/exp/include/include3.php…

【C++ OJ练习】1.求和

1.题目链接 求123...n_牛客题霸_牛客网 2.解题思路 利用C构造函数的特性 既然不能使用循环 那么我们可以定义n个对象 就会调用n次构造函数 去代替循环 每次调用的时候进行加法的计算 3.代码 class Sum { public:Sum(){_sum _i;_i;}static void Init(){_i 1;_sum 0;}st…

ruoyi若依 组织架构设计--[ 菜单管理 ]

ruoyi若依 组织架构设计--[ 菜单管理 ] 1. 关于ruoyi组织架构各个表的设计2. 从产品的角度考虑 [ 菜单管理 ]2.1菜单树List页面2.2 菜单树新增2.3 菜单树修改2.4 删除菜单 1. 关于ruoyi组织架构各个表的设计 1.部门表 ancestors字段。 添加这个字段,方便列举所有子…

用maven安装Netty

Netty简单介绍 官网:https://netty.io/index.html Netty是一个异步的、事件驱动的网络应用框架,既可用于开发高性能的服务端,也可用于开发客户端。 Netty是一个NIO的客户端和服务端框架,用于快速、容易地开发网络应用&#xff0c…

Linux·图解Linux网络包接收过程

因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化。而很多时候,如果你对Linux底层的理解不深的话&…

Paddle OCR 安装使用教程

简介 PaddleOCR是飞浆开源文字识别模型,最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别;支持倾斜、竖排等多种方向文字识别;支持GPU、CPU预测,并且支持使用paddle开源组件训练自己的超轻量模型,对于…