Python 如何实现 Mediator 中介者设计模式?什么是中介者设计模式?Python 设计模式示例代码

什么是中介者设计模式?

中介者(Mediator)设计模式是一种行为型设计模式,其主要目的是通过将对象之间的直接交互转变为通过中介者对象进行的间接交互,从而减少对象之间的耦合度。中介者模式通过集中控制对象之间的通信,帮助维护系统的一致性。

中介者设计模式,python实现

在中介者模式中,对象之间不再直接相互通信,而是通过中介者进行通信。这有助于减少系统中对象之间的直接关联,使系统更加灵活和易于维护。中介者模式通常适用于对象之间的交互结构比较复杂、对象之间存在大量的关联和依赖关系的场景。

主要角色:

  1. 中介者(Mediator): 定义一个接口用于与各同事对象通信,并负责实现具体的协调逻辑。中介者知道各同事对象,可以根据接收到的消息进行相应的处理。

  2. 同事对象(Colleague): 是相互交互的对象。每个同事对象都知道中介者对象,但它们不需要直接了解其他同事对象。同事对象将需要交互的行为委托给中介者处理。

优点:

  1. 降低耦合度: 中介者模式通过将对象之间的直接交互转移为间接交互,降低了对象之间的耦合度,使得系统更加灵活。

  2. 集中控制: 中介者模式集中了对对象之间交互的控制,有助于更好地维护和管理系统。

  3. 简化对象: 同事对象不需要了解其他同事对象的细节,只需要与中介者对象通信,简化了对象的设计和实现。

  4. 促进复用: 中介者模式将对象之间的交互逻辑集中在中介者中,使得这部分逻辑更容易被复用。

Python 中介者设计模式示例代码(一):

考虑一个简化的聊天室系统。在这个系统中,用户可以发送消息给其他用户,但不直接与其他用户进行通信,而是通过聊天室中介者来实现。

from abc import ABC, abstractmethod

# 中介者接口
class ChatMediator(ABC):
    @abstractmethod
    def send_message(self, message, user):
        pass

# 具体中介者
class ChatRoom(ChatMediator):
    def send_message(self, message, user):
        print(f"{user.name} sends message: {message}")

# 同事对象
class User:
    def __init__(self, name, mediator):
        self.name = name
        self.mediator = mediator

    def send_message(self, message):
        self.mediator.send_message(message, self)

# 客户端
mediator = ChatRoom()
user1 = User("Alice", mediator)
user2 = User("Bob", mediator)

user1.send_message("Hello, Bob!")  # Output: Alice sends message: Hello, Bob!
user2.send_message("Hi, Alice!")   # Output: Bob sends message: Hi, Alice!

在这个例子中,ChatRoom 充当中介者,而 User 充当同事对象。用户通过中介者发送消息,而不是直接与其他用户通信。这样,通过中介者,用户之间的通信变得更加灵活和可控。


Python 中介者设计模式示例代码(二):

考虑一个简化的飞机调度系统,其中飞机可以向控制塔发送飞行状态,而不直接与其他飞机通信。控制塔作为中介者负责协调各个飞机的行动。

from abc import ABC, abstractmethod
from datetime import datetime

# 中介者接口
class AirTrafficControl(ABC):
    @abstractmethod
    def send_status(self, status, aircraft):
        pass

# 具体中介者
class ControlTower(AirTrafficControl):
    def send_status(self, status, aircraft):
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        print(f"{timestamp} - {aircraft.name} reports: {status}")

# 同事对象
class Aircraft:
    def __init__(self, name, control_tower):
        self.name = name
        self.control_tower = control_tower

    def report_status(self, status):
        self.control_tower.send_status(status, self)

# 客户端
control_tower = ControlTower()
aircraft1 = Aircraft("Flight001", control_tower)
aircraft2 = Aircraft("Flight002", control_tower)

aircraft1.report_status("Departed from Airport A")  # Output: Flight001 reports: Departed from Airport A
aircraft2.report_status("Arrived at Airport B")     # Output: Flight002 reports: Arrived at Airport B

在这个例子中,ControlTower 充当中介者,而 Aircraft 充当同事对象。飞机通过中介者向控制塔报告飞行状态,而不是直接与其他飞机通信。这种设计使得系统更具可扩展性和维护性。


使用外观设计模式,需要注意哪些方面?

使用中介者设计模式时需要注意一些关键的地方,以确保模式的有效实施和系统的良好设计。以下是一些需要注意的方面:

  1. 中介者的单一职责: 中介者应该专注于协调对象之间的交互,不应该包含与具体对象直接相关的业务逻辑。确保中介者遵循单一职责原则。

  2. 避免过度集中化: 虽然中介者负责协调对象之间的交互,但不应该成为系统中所有对象的集中化点。过度集中化可能导致中介者变得庞大且难以维护。

  3. 平衡灵活性和耦合度: 中介者模式的目标之一是减少对象之间的耦合度,但不应该以损害系统灵活性为代价。确保中介者不过于僵化,能够支持系统的扩展和变化。

  4. 合理划分同事对象的责任: 同事对象之间的通信应该由中介者协调,但同事对象本身的责任仍然需要合理划分。不要让同事对象的职责过于模糊或混乱。

  5. 中介者与同事对象的通信机制: 中介者需要提供一种有效的机制,让同事对象能够与中介者进行通信。这可能涉及到中介者接口的设计和同事对象的注册过程。

  6. 考虑扩展性: 考虑系统可能的扩展需求。中介者模式应该能够容易地支持新的同事对象的加入,而不需要对现有中介者进行过多修改。

  7. 良好的命名和文档: 中介者模式涉及多个角色和对象,良好的命名和文档对于代码的可读性和维护性非常重要。确保每个角色和方法都有清晰的命名和文档说明。

  8. 测试中介者的独立性: 中介者应该是独立于具体同事对象的,这样可以方便地对中介者进行单独的测试。确保中介者的正确性和稳定性。

  9. 不同同事对象的异构性: 考虑系统中不同同事对象之间的异构性,确保中介者能够适应不同类型的同事对象,而不仅仅局限于某一种类型。

  10. 性能考虑: 中介者模式可能引入一些性能开销,尤其在系统规模较大时。在设计中要注意性能方面的考虑,避免不必要的开销。

综上所述,合理使用中介者设计模式需要综合考虑系统的结构、扩展需求以及设计的灵活性。良好的设计能够使系统更加清晰、易于维护,并且能够适应未来的变化。


本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

golang学习笔记——递归函数

递归函数 递归,就是在运行的过程中调用自己。 语法格式如下: func recursion() {recursion() /* 函数调用自身 */ }func main() {recursion() }阶乘 阶乘最初的定义就是小于等于某个正整数的所有正整数的乘积,5 的阶乘(记作 5!…

我所理解的 UI Toolkit 启蒙阶段(一)

我所理解的 UI Toolkit 启蒙阶段(一) 对于自己不会的新东西的学习,我认为最合适的路径就是: 实例教学视频 —> 实操熟悉 —> 官方文档查漏补缺 —> 拟定思路实现功能 但这 4 步并非每一步都需要下 100% 的功夫&#x…

三菱FX3U小项目—传输带定分级控制

目录 一、项目描述 二、IO口分配 三、项目程序 四、总结 一、项目描述 两条运输带顺序相连,为了避免运送的物料在1号运输线上堆积,所以启动时,1号运输带开始运行,5S后2号运输带自动启动。停机时顺序与启动刚好相反&#xff0c…

什么是智慧仓储?

“关于智慧仓储,有的说是AGV,有的说是自动化立库,还有的WMS厂家也说自己的系统是智慧仓储,到底什么是智慧仓储?” 先一句话总结一下智慧仓储—— 智慧仓储是指利用先进的信息技术和物联网技术对仓储管理进行优化和智能…

游戏工作中用到的一些第3方软件和作用

记录下平时工作中发现的一些好用的软件: Snipaste:截屏软件 最好用的功能就是可以将截的图留在屏幕上,用来做提醒或者对比. RenderDoc:图形调试器 图形图像开\分析和捕捉时要用到的强大工具,可以捕捉图形帧并分析和调试.涵盖Vulkan,D3D11,D3D12.OpenGL,OpenGL ES以及windows …

postman查询数据库-Xmysql

步骤1:安装node.js 下载地址:Download | Node.js步骤2:安装Xmysql工具,命令行输入 npm install -g xmysql ,过程中会自动安装相关依赖;步骤3:连接数据库 xmysql -h ip -u 账号 -p 密码 -d 库名 如下表示连…

期刊会议的选择

目录 找到所有⽬标期刊定具体期刊 找到所有⽬标期刊 定具体期刊

用Python做安全测试攻击实战

在本文中,我们将使用Python进行一次安全测试的实战演练,目标是找出并利用应用程序的安全漏洞。请注意,这个演练仅用于教育和研究目的,切勿将这些技术用于非法活动。 注意:未经授权的攻击是违法的。确保你在拥有明确权…

Redis数据的持久化

Redis的持久化有两种方式: RDB(Redis Database)和AOF(Append Only File) 目录 一、RDB 保存方式 2、rdb在redis.conf文件中的配置 二、AOF 1、保存方式 2、aof方式持久化在redis.conf文件中的配置 三、持久化建…

JAXB的XmlElement注解

依赖 如果基于JAX-WS开发&#xff0c;可以在maven工程的pom.xml文件中增加如下依赖&#xff0c;会将依赖的JAXB库也下载下来&#xff1a; <dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><vers…

Kafka学习笔记(三)

目录 第5章 Kafka监控&#xff08;Kafka Eagle&#xff09;5.2 修改kafka启动命令5.2 上传压缩包5.3 解压到本地5.4 进入刚才解压的目录5.5 将kafka-eagle-web-1.3.7-bin.tar.gz解压至/opt/module5.6 修改名称5.7 给启动文件执行权限5.8 修改配置文件5.9 添加环境变量5.10 启动…

一文带你了解docker技术

什么是Docker Docker是一种虚拟技术&#xff0c;诞生于2013年&#xff0c;是dotCloud公司研发的开源项目&#xff0c;因为docker这个公司后来改名docker inc&#xff0c;docker的目标是实现轻量级的操作系统虚拟化解决方案。通俗点说&#xff0c;我们想在一台机器上运行多个系…

卫士之选:迅软DSE解决方案助力IT企业应对数据泄密威胁!

随着信息技术的迅猛发展&#xff0c;软件IT行业正面临着前所未有的数据安全挑战。病毒传播、内部泄密等安全威胁不断涌现&#xff0c;对企业的重要资产和运营造成了严重威胁。与此同时&#xff0c;国家对数据安全的法律法规日益严格&#xff0c;要求企业采取更加有效的措施来保…

Python大数据之linux学习总结——day09_hive函数

hive函数 函数分类标准[重点] 知识点: 原生分类标准: 内置函数 和 用户定义函数(UDF,UDAF,UDTF)分类标准扩大化: 本来&#xff0c;UDF 、UDAF、UDTF这3个标准是针对用户自定义函数分类的&#xff1b; 但是&#xff0c;现在可以将这个分类标准扩大到hive中所有的函数&#…

基于vue-tianditu实现瓦片数据层添加

效果 瓦片TileJson 包下载 pnpm add vue-tianditu main.ts import VueTianditu from "vue-tianditu"; const app createApp(App); app.use(VueTianditu, { v: "4.0", //目前只支持4.0版本 tk: "0b58ed11713850170e0d643e06be225e", }); 拿到瓦…

Spring3新特性:graalvm打包Springboot+Mybatis

Spring3新特性 graalvm打包SpringbootMybatis 项目源代码 https://github.com/cmdch2017/SpringNative_Graalvm_Mybatis 如何安装与运行 安装graalvm与配置环境 首先安装步骤参考这篇博客 https://blog.csdn.net/weixin_38943666/article/details/129505945 其次如何处理…

Linux下非root用户安装CUDA

目录 前言 参考链接 步骤 一. 首先&#xff0c;需要查看系统版本&#xff1a; 二. 安装包下载。 下载CUDA&#xff1a; cuDNN下载 三. 开始安装CUDA和cuDNN 安装CUDA 修改环境变量 安装 cuDNN 查看是否安装成功&#xff0c;输入nvcc -V 前言 由于一些代码实现&…

02-3解析BeautifulSoup

一、基本简介 BeautifulSoup简称&#xff1a;bs4什么是BeatifulSoup&#xff1f;  BeautifulSoup&#xff0c;和lxml一样&#xff0c;是一个html的解析器&#xff0c;主要功能也是解析和提取数据优缺点&#xff1f;  缺点&#xff1a;效率没有lxml的效率高  优点&#xff1…

Transformers实战——Datasets板块

文章目录 一、基本使用1.加载在线数据集2.加载数据集合集中的某一项任务3.按照数据集划分进行加载4.查看数据集查看一条数据集查看多条数据集查看数据集里面的某个字段查看所有的列查看所有特征 5.数据集划分6.数据选取与过滤7.数据映射8.保存与加载 二、加载本地数据集1.直接加…

MARKDOWN

新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#xff0c;除了标准的Markdown编辑器功能&#xff0c;我们增加了如下几点新功能&#xff0c;帮助你用它写博客&#xff1a; 全新的界面设计 &#xff0c;将会带来全新的写作体验&#xff1b;在创作中心设置你喜爱…