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

news2024/10/7 20:33:23

什么是中介者设计模式?

中介者(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.coloradmin.cn/o/1221180.html

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

相关文章

【基础算法】筛质数

文章目录 问题描述解决方法朴素筛法线性筛法 问题描述 给定一个正整数 n n n,请你求出 1 ∼ n 1∼n 1∼n 中质数的个数。 输入格式 共一行,包含整数 n。 输出格式 共一行,包含一个整数,表示 1∼n 中质数的个数。 数据范围 …

关于python中内存分配的问题,运行一些操作可能会导致为新结果分配内存,用Python的id()函数演示

一、考虑背景: 一般在python中不会考虑像C中的内存问题,但是在一些高级应用中会考虑,例如有一个特别特别大的矩阵,最好不要不断的赋值,导致内存问题产生。 二、python中的id: 在python中有个id&#xff…

Postman:API测试之Postman使用完全指南

Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流。 Postman工具有Chrome扩展和独立客户端,推荐安装独立客户端。 Postman有个workspace的概念,workspace分personal和team类型…

Java JVM虚拟机

加载字节码文件.class 1字节一般为8位 字节码结构: 第一部分 4字节 cafebaby 第二部分 版本号 00 00 00 32, 第三部分 常量数量 count 第四部分常量池 常量类型表示: 继承关系改变 1.1以后 后面是属性方法 等参数 通过javap 反编译class ,javap xx.class javap -c xxx.…

redis实战篇(2)

优惠卷秒杀 通过本章节,我们可以学会Redis的计数器功能, 结合Lua完成高性能的redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列 3、优惠卷秒杀 3.1 -全局唯一ID 每个店铺都可以发布优惠券: 当用户抢…

京东数据采集与挖掘(京东大数据):2023年10月京东冰箱品牌销售排行榜

鲸参谋监测的京东平台10月份冰箱市场销售数据已出炉! 10月份,冰箱市场的销售额有小幅上涨。鲸参谋数据显示,在京东平台上,今年10月冰箱市场的销量为94万,销售额将近23亿,同比增长超过1%。从价格上看&#x…

【Java 进阶篇】揭秘 JQuery 广告显示与隐藏:打造令人惊艳的用户体验

在当今互联网时代,广告已经成为网页中不可忽视的一部分。然而,如何通过巧妙的交互设计,使广告既能吸引用户的眼球,又不会给用户带来干扰,成为了许多前端开发者需要思考的问题之一。在这篇博客中,我们将深入…

vscode文件夹折叠问题

今天发现一个vscode的文件夹显示的问题,首先是这样的,就是我的文件夹里又一个子文件夹,子文件夹里有一些文件,但是我发现无法折叠起这个子文件夹,总是显示全部的文件,这让我备份很难,具体参考 h…

pipeline agent分布式构建

开启 agent rootjenkins:~/learning-jenkins-cicd/07-jenkins-agents# docker-compose -f docker-compose-inbound-agent.yml up -d Jenkins配置添加 pipeline { agent { label docker-jnlp-agent }parameters {booleanParam(name:pushImage, defaultValue: true, descript…

vscode中vue项目引入的组件的颜色没区分解决办法

vscode中vue项目引入的组件的颜色没区分解决办法 图中引入组件和其他标签颜色一样没有区分,让开发者不易区分,很蓝瘦 这个就很直观,解决办法就是你当前的vscode版本不对,你得去找找其他版本,我的解决办法就是去官网历…

Python入门简介及下载安装,超详细教学!

文章目录 一、Python简介:Python解释器的类型Python的运行机制1、查看 Python 版本2、第一个Python3.x程序3、Python 应用 二、Python安装(windows)1、下载2、安装步骤: 三、运行Python1、交互式解释器:扩展&#xff1…

美团外卖APP如何查看使用美团外卖红包优惠券?

美团外卖APP如何查看美团外卖红包优惠券? 1、手机打开美团外卖APP; 2、点击底部我的>我的资产>红包/神券,即可查看到美团外卖红包优惠券; 美团外卖红包优惠券怎么免费领取? 关注「草柴」公众号,回复…

JAVA深化篇_42—— 正则表达式

3 正则表达式 3.1正则表达式介绍 3.1.1 什么是正则表达式 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),是计算机科学的一个概念。正则表达式通常被用来…

【Linux】:进程间通信

进程间通信 一.基本概念二.简单的通信-管道1.建立通信信道2.通信接口 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在,导致进程间的通信成本比较高。 为什么 因为我们有多进程协同的需求。 怎么办 a.进程间通信的本质:必须让不…

新手必看!!STM32定时器简介

一、定时器有哪些? 定时器分为三大类:基本定时器、通用定时器和高级定时器。 二、每个定时器的功能以及使用场景 1. 基本定时器(Basic Timers): 功能: 基本定时器具有较为简单的功能,通常用于…

2023.11.17 hadoop之HDFS进阶

目录 HDFS的机制 edits和fsimage文件 HDFS的存储原理 写入数据原理: 读取数据原理: 元数据简介 元数据存储流程 HDFS安全机制 HDFS归档机制 HDFS垃圾桶机制 接着此前的内容 https://blog.csdn.net/m0_49956154/article/details/134298109?spm1001.2014.3001.5501 …

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

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

基于数据库(MySQL)与缓存(Redis)实现分布式锁

分布式锁 分布式锁:分布式锁是在分布式的情况下实现互斥类型的一种锁 实现分布式锁需要满足的五个条件 可见性:多个进程都能看到结果互斥性:只允许一个持有锁的对象的进入临界资源可用性:无论何时都要保证锁服务的可用性&#x…

Kafka入门教程与详解(一)

Kafka入门教程与详解(一) 一、Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务。消息传送依赖于大量支持组件,这些组件负责处理连接服务、消息的路由和传送、持久性、安全性以及日志记录。消…

C++类中public 和 protected 和 private访问权限 struct和class的区别 类成员设置为私有自己控制权限

public 和 protected 和 private访问权限 public 公共权限 类内可以访问 类外可以访问 protected 保护权限 类内可以访问 类外不可以访问 儿子可以访问父亲中的保护内容如父亲的车 private 私有权限 类内可以访问 类外不可以访问 儿子不可以访问父亲的私有权限内容如不想…