设计模式:第四章 中介模式
第四章 中介模式
- 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 设计要点
中介模式主要有以下三个角色,在设计中介模式时要找到并区分这些角色:
- 交互对象(InteractiveObject):要进行交互的一系列对象。
- 中介者(Mediator):负责协调各个对象之间的交互。
- 具体中介者(Mediator):中介的具体实现。
4.2 优缺点
优点
- Mediator将原本分布于多个对象间的行为集中在一起,作为一个独立的概念并将其封装在一个对象中,简化了对象之间的交互。
- 将多个调用者与多个实现者之间多对多的交互关系,转换为一对多的交互关系,一对多的交互关系更易于理解、维护和扩展,大大减少了多个对象之间相互交叉引用的情况。
缺点
- 中介者承接了所有的交互逻辑,交互的复杂度转变成了中介者的复杂度,中介者类会变得越来越庞大和复杂,以至于难以维护。
- 中介者出问题会导致多个使用者同时出问题。
5. 应用场景
- 一组对象以定义良好但复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,同时又不想生成太多的子类。
[1]程杰.大话数据模式[M].北京:清华大学出版社,2007.
[2]罗伟富.人人都懂设计模式:从生活中领悟设计模式:Python实现[M].北京:电子工业出版社,2019.
本文为书籍《大话数据模式》和《人人都懂设计模式:从生活中领悟设计模式:Python实现》阅读笔记 ↩︎
设计模式:第四章 中介模式相关推荐
- 【设计模式2022】第四章 工厂模式
[设计模式2022]第四章 工厂模式 文章目录 [设计模式2022]第四章 工厂模式 一.概述 二.简单工厂模式 1.结构 2.实现 3.分析 4.扩展 三.工厂方法模式 1.结构 2.实现 3.分析 ...
- 【设计模式】第四章 工厂模式
第四章 工厂模式 文章目录 第四章 工厂模式 一.介绍 二.简单工厂模式 三.工厂方法模式 四.抽象工厂模式 一.介绍 工厂模式(Factory Pattern),工厂就是创建产品的地方,根据创建的产 ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- 设计模式(四)--代理模式
设计模式(四)–代理模式 文章目录 设计模式(四)--代理模式 其他链接 代理模式 1.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...
- 肝一肝设计模式【四】-- 建造者模式
系列文章目录 肝一肝设计模式[一]-- 单例模式 传送门 肝一肝设计模式[二]-- 工厂模式 传送门 肝一肝设计模式[三]-- 原型模式 传送门 肝一肝设计模式[四]-- 建造者模式 传送门 肝一肝设 ...
- 设计模式(四)——原型模式详解
设计模式(四)--原型模式详解 定义 结构 实现 案例 浅克隆 深克隆 定义 原型模式就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含以下角色: ...
- 【设计模式】第二章 代理模式
第二章 代理模式 文章目录 第二章 代理模式 一.简介 一.静态代理 二.动态代理 1.JDK 代理 2.CGLib 代理 三.总结 一.简介 你可能会对这个设计模式感到陌生,但是你对 Spring ...
- 23种设计模式(第二章创建者模式5种)
第二章创建者模式 单例模式 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类对外提供一个访问该单例的全局访问点. 单例模式的实现 单例设计模式分类两种: ...
- 设计模式--第七章 克隆模式
第七章 克隆模式 1. 核心思想 2. UML类图 3. 框架代码 4. 优缺点 5. 应用场景 1. 核心思想 用原型实例指定要创建对象的种类,并通过拷贝这些原型的属性来创建新的对象. 通过拷贝自身 ...
最新文章
- RPi 3B Aduio 3.5mm output
- SetupFactory安装制作心得
- GitHub热榜第一:中国博士用 ArcGIS Dashboard开发可交互全球疫情地图,登上《柳叶刀》!...
- 基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis
- Silverlight中使用MVVM(9)-绑定Enum类型数据
- asp.net core2.0中网站发布的时候,怎么样才配置才可以使视图文件不被打包进去?...
- 函数防抖debounce和节流throttle
- 如何插入电子签名_如何在电子文档上签名?可靠电子签名的特征有哪些?
- 2d游戏引擎_Cocos Creator:用 2D 物理碰撞撸 3D 横版酷跑
- gradle 的cas 转maven_gradle 转 maven
- hex2bin和bin2hex
- Excel数据分析实例
- 微信文章搜索工具, 推荐使用它,简单好用
- 齐齐哈尔大学计算机专业好么,齐齐哈尔大学(专业学位)计算机技术考研难吗
- 我的世界java版粘土服务器ip,clay黏土服务器下载
- 关于交换机包转发率1.488Mpps是如何计算出来的?
- K12在线教育持续升温,教育需线上线下相结合!
- markdown编辑微信公众号
- 2.2.1 数据通信系统的模型
- MySQL学习(8)︱DISTINCT去重与表连接
热门文章
- kubeadm集群化部署多master节点(生产环境适用)
- EasyPoi导出Excel实现标记颜色
- 柔性电子: Triboelectric Nanogenerator摩擦生电
- c#设计一个Windows应用程序,模拟一个简单的银行账户管理系统。完成“创建账A款”“存款”和“查询余额”的模拟操作。程序功能如下:
- SWR:最具潜力的 React Hooks 数据请求库
- R语言学习20150414
- 防止学生机退出电子教室软件的方法
- 常用DOS命令之通俗易懂篇
- 苹果cms模板_苹果CMS建站的一些心得
- 2021全球50家最佳酒吧榜单揭晓,有6家来自中国