第四章 中介模式

  • 1. 核心思想
  • 2. UML类图
  • 3. 代码框架
  • 4. 模型说明
    • 4.1 设计要点
    • 4.2 优缺点
  • 5. 应用场景

1

1. 核心思想

由中介来承接房客与房东之间的交互过程,可以使得整个租房过程更加畅通、高效。这在程序中叫作中介模式,中介模式又称为调停模式。

在很多系统中,多个类很容易相互耦合,形成网状结构。中介模式的作用就是将这种网状结构分离成星型结构。经过这样的调整后,对象之间的结构更加简洁,交互更加顺畅。

2. UML类图

3. 代码框架

from abc import ABC, abstractmethod
import sys
from typing import Anyclass InteractiveObject(ABC):def __init__(self, mediator) -> None:self._mediator = mediatorclass InteracivaObjectImplA(InteractiveObject):def send(self, message:Any):print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")print("----{} send message:'{}' to {}".format(self.__class__.__name__, message, self._mediator.__class__.__name__))self._mediator.send(message, self)def notify(self, message):print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")print("----{} received mesage:'{}'".format(self.__class__.__name__, message))class InteracivaObjectImplB(InteractiveObject):def send(self, message:Any):print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")print("----{} send message:'{}' to {}".format(self.__class__.__name__, message, self._mediator.__class__.__name__))self._mediator.send(message, self)def notify(self, message):print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")print("----{} received mesage:'{}'".format(self.__class__.__name__, message))class AbstractMediator(ABC):@abstractmethoddef send(self, message:Any, interactivObject: InteractiveObject):passclass Mediator(AbstractMediator):def setInteractiveObjectImplA(self, interactiveObjectImplA):self.interactiveObjectImplA = interacivaObjectImplAdef setInteractiveObjectImplB(self, interactiveObjectImplB):self.interactiveObjectImplB = interacivaObjectImplBdef send(self, message: Any, interactiveObject: InteractiveObject):print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name}")if interactiveObject ==self.interactiveObjectImplA:print("----{} receive message:'{}' from {} and send to {}".format(self.__class__.__name__, message, interactiveObject.__class__.__name__, self.interactiveObjectImplB.__class__.__name__))self.interactiveObjectImplB.notify(message)else:print("----{} receive message:'{}' from {} and send to {}".format(self.__class__.__name__, message, interactiveObject.__class__.__name__, self.interactiveObjectImplA.__class__.__name__))self.interactiveObjectImplA.notify(message)if __name__ == "__main__":mediator = Mediator()# 交互对象认识中介对象interacivaObjectImplA=InteracivaObjectImplA(mediator)interacivaObjectImplB=InteracivaObjectImplB(mediator)# 中介对象认识每个交互对象mediator.setInteractiveObjectImplA(interacivaObjectImplA)mediator.setInteractiveObjectImplB(interacivaObjectImplB)# 交互对象A和交互对象B通过中介对象交流interacivaObjectImplA.send("Have you eaten dinner?")interacivaObjectImplB.send("Not yet, do you want to invite me?")

4. 模型说明

4.1 设计要点

中介模式主要有以下三个角色,在设计中介模式时要找到并区分这些角色:

  1. 交互对象(InteractiveObject):要进行交互的一系列对象。
  2. 中介者(Mediator):负责协调各个对象之间的交互。
  3. 具体中介者(Mediator):中介的具体实现。

4.2 优缺点

  1. 优点

    • Mediator将原本分布于多个对象间的行为集中在一起,作为一个独立的概念并将其封装在一个对象中,简化了对象之间的交互。
    • 将多个调用者与多个实现者之间多对多的交互关系,转换为一对多的交互关系,一对多的交互关系更易于理解、维护和扩展,大大减少了多个对象之间相互交叉引用的情况。
  2. 缺点

    • 中介者承接了所有的交互逻辑,交互的复杂度转变成了中介者的复杂度,中介者类会变得越来越庞大和复杂,以至于难以维护。
    • 中介者出问题会导致多个使用者同时出问题。

5. 应用场景

  1. 一组对象以定义良好但复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  2. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  3. 想通过一个中间类来封装多个类中的行为,同时又不想生成太多的子类。

[1]程杰.大话数据模式[M].北京:清华大学出版社,2007.
[2]罗伟富.人人都懂设计模式:从生活中领悟设计模式:Python实现[M].北京:电子工业出版社,2019.


  1. 本文为书籍《大话数据模式》和《人人都懂设计模式:从生活中领悟设计模式:Python实现》阅读笔记 ↩︎

设计模式:第四章 中介模式相关推荐

  1. 【设计模式2022】第四章 工厂模式

    [设计模式2022]第四章 工厂模式 文章目录 [设计模式2022]第四章 工厂模式 一.概述 二.简单工厂模式 1.结构 2.实现 3.分析 4.扩展 三.工厂方法模式 1.结构 2.实现 3.分析 ...

  2. 【设计模式】第四章 工厂模式

    第四章 工厂模式 文章目录 第四章 工厂模式 一.介绍 二.简单工厂模式 三.工厂方法模式 四.抽象工厂模式 一.介绍 工厂模式(Factory Pattern),工厂就是创建产品的地方,根据创建的产 ...

  3. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  4. 设计模式(四)--代理模式

    设计模式(四)–代理模式 文章目录 设计模式(四)--代理模式 其他链接 代理模式 1.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...

  5. 肝一肝设计模式【四】-- 建造者模式

    系列文章目录 肝一肝设计模式[一]-- 单例模式 传送门 肝一肝设计模式[二]-- 工厂模式 传送门 肝一肝设计模式[三]-- 原型模式 传送门 肝一肝设计模式[四]-- 建造者模式 传送门 肝一肝设 ...

  6. 设计模式(四)——原型模式详解

    设计模式(四)--原型模式详解 定义 结构 实现 案例 浅克隆 深克隆 定义 原型模式就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含以下角色: ...

  7. 【设计模式】第二章 代理模式

    第二章 代理模式 文章目录 第二章 代理模式 一.简介 一.静态代理 二.动态代理 1.JDK 代理 2.CGLib 代理 三.总结 一.简介 你可能会对这个设计模式感到陌生,但是你对 Spring ...

  8. 23种设计模式(第二章创建者模式5种)

    第二章创建者模式 单例模式 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类对外提供一个访问该单例的全局访问点. 单例模式的实现 单例设计模式分类两种: ​ ...

  9. 设计模式--第七章 克隆模式

    第七章 克隆模式 1. 核心思想 2. UML类图 3. 框架代码 4. 优缺点 5. 应用场景 1. 核心思想 用原型实例指定要创建对象的种类,并通过拷贝这些原型的属性来创建新的对象. 通过拷贝自身 ...

最新文章

  1. RPi 3B Aduio 3.5mm output
  2. SetupFactory安装制作心得
  3. GitHub热榜第一:中国博士用 ArcGIS Dashboard开发可交互全球疫情地图,登上《柳叶刀》!...
  4. 基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis
  5. Silverlight中使用MVVM(9)-绑定Enum类型数据
  6. asp.net core2.0中网站发布的时候,怎么样才配置才可以使视图文件不被打包进去?...
  7. 函数防抖debounce和节流throttle
  8. 如何插入电子签名_如何在电子文档上签名?可靠电子签名的特征有哪些?
  9. 2d游戏引擎_Cocos Creator:用 2D 物理碰撞撸 3D 横版酷跑
  10. gradle 的cas 转maven_gradle 转 maven
  11. hex2bin和bin2hex
  12. Excel数据分析实例
  13. 微信文章搜索工具, 推荐使用它,简单好用
  14. 齐齐哈尔大学计算机专业好么,齐齐哈尔大学(专业学位)计算机技术考研难吗
  15. 我的世界java版粘土服务器ip,clay黏土服务器下载
  16. 关于交换机包转发率1.488Mpps是如何计算出来的?
  17. K12在线教育持续升温,教育需线上线下相结合!
  18. markdown编辑微信公众号
  19. 2.2.1 数据通信系统的模型
  20. MySQL学习(8)︱DISTINCT去重与表连接

热门文章

  1. kubeadm集群化部署多master节点(生产环境适用)
  2. EasyPoi导出Excel实现标记颜色
  3. 柔性电子: Triboelectric Nanogenerator摩擦生电
  4. c#设计一个Windows应用程序,模拟一个简单的银行账户管理系统。完成“创建账A款”“存款”和“查询余额”的模拟操作。程序功能如下:
  5. SWR:最具潜力的 React Hooks 数据请求库
  6. R语言学习20150414
  7. 防止学生机退出电子教室软件的方法
  8. 常用DOS命令之通俗易懂篇
  9. 苹果cms模板_苹果CMS建站的一些心得
  10. 2021全球50家最佳酒吧榜单揭晓,有6家来自中国