软件架构的优雅之舞:深入探索Python中介者模式

server/2024/9/23 7:26:04/

在软件设计中,中介者模式是一种行为设计模式,它通过引入一个中介者对象来封装一系列对象之间的交互,从而降低对象之间的耦合度。这种模式使得对象之间的交互更加灵活,易于维护和扩展。以下是对中介者模式的详细解释和Python实现示例。

什么是中介者模式

中介者模式是一种行为设计模式,它通过一个中介者对象来封装和协调多个对象之间的交互。这个模式可以减少对象之间的直接依赖,使得它们可以独立地变化和复用。

中介者模式的结构

中介者模式通常包含以下几个角色:

  1. 中介者(Mediator):定义了一个接口用于与各个同事对象通信,并负责协调各个同事对象之间的交互关系。
  2. 具体中介者(Concrete Mediator):实现了中介者接口,并持有一组同事对象的引用,负责实际的协调工作。
  3. 同事(Colleague):每个同事对象都知道中介者对象,并通过中介者对象来与其他同事对象通信。

中介者模式的优点

  • 降低耦合度:通过引入中介者对象来降低对象之间的直接耦合度。
  • 集中控制:将对象之间的交互逻辑集中在一个对象中进行管理和控制。
  • 易于扩展:可以比较容易地添加新的同事对象或调整交互逻辑。

中介者模式的缺点

  • 中介者对象可能过于庞大:随着系统复杂度的增加,中介者对象可能会变得难以维护和理解。

中介者模式的实现

在Python中,中介者模式可以通过定义抽象中介者类和具体中介者类以及同事类来实现。以下是使用Python实现中介者模式的示例代码:

python">from abc import ABC, abstractmethodclass Mediator(ABC):@abstractmethoddef send(self, message, colleague):passclass ConcreteMediator(Mediator):def __init__(self):self.colleagues = []def add_colleague(self, colleague):self.colleagues.append(colleague)def send(self, message, colleague):for c in self.colleagues:if c != colleague:c.receive(message)class Colleague(ABC):def __init__(self, mediator):self._mediator = mediatordef send(self, message):self._mediator.send(message, self)@abstractmethoddef receive(self, message):passclass ConcreteColleague1(Colleague):def receive(self, message):print(f"Colleague 1 received: {message}")class ConcreteColleague2(Colleague):def receive(self, message):print(f"Colleague 2 received: {message}")# 使用中介者模式
mediator = ConcreteMediator()
colleague1 = ConcreteColleague1(mediator)
colleague2 = ConcreteColleague2(mediator)mediator.add_colleague(colleague1)
mediator.add_colleague(colleague2)colleague1.send("Hello")
colleague2.send("World")

在这个示例中,ConcreteMediator 类作为中介者,负责协调 ConcreteColleague1ConcreteColleague2 之间的消息传递。每个同事类都通过中介者来发送消息,而不是直接相互通信。这样,如果系统中添加了新的同事类,只需要将它们添加到中介者的列表中即可,无需修改其他同事类的代码。

结论

中介者模式是解决对象间交互复杂性的有效方法。通过使用中介者模式,你可以简化对象间的通信,降低耦合度,并提高系统的可维护性和可扩展性。然而,需要注意的是,中介者对象可能会变得复杂,因此在设计时应谨慎考虑其职责范围。


http://www.ppmy.cn/server/98977.html

相关文章

Java Web —— 第四天(HTTP协议,Tomcat)

HTTP-概述 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则 特点: 1. 基于TCP协议:面向连接,安全 2.基于请求-响应模型的:一次请求对应一次响应 3. HTTP协议是无状态的协议: 对于事务处理没有…

SSTI模版注入(初步)

SSTI模版注入(初步) ssti可能造成任意文件读取和RCE远程控制后台系统 漏洞成因:渲染模版时,没有严格控制对用户的输入; 使用了危险的模版,导致用户可以混合flask程序进行交互。 flask是基于python开发的…

计算机毕业设计选题推荐-网上考试系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

前端已经学会vue,做粒子效果

目录 1. Canvas API 2. WebGL 3. 粒子系统 4. 动画与性能优化 5. 现有库和框架 6. Vue 组件和状态管理 实践项目建议 案例1 案例2雪花 已经熟悉了 Vue、TypeScript 和 JavaScript,下面是一些你可以学习的内容,以帮助你实现粒子效果的界面&#…

C语言 | Leetcode C语言题解之第326题3的幂

题目: 题解: bool isPowerOfThree(int n){int count0;while(n){countn%3;n/3;}return count1?true:false;}

亲身教学看我如何轻松完成暑期三下乡社会实践投稿

正值暑期,作为暑期三下乡社会实践活动的一员,我肩负着志愿服务团队的宣传报道工作。初接触这项任务时,我对如何轻松完成投稿一无所知,只知道通过邮箱向各大媒体投稿是常见的做法。然而,现实却给我上了一堂深刻的课。 一、邮箱投稿的艰辛 起初,我满怀热情地投入到这项工作中,搜…

[论文笔记]BM25S:Python打造超越RANK-BM25的实现

引言 今天带来一篇BM25变种的论文笔记,不要低估BM25,在RAG中检索中通常都会引入BM25检索,然后配合嵌入模型进行混合检索。 BM25S: Orders of magnitude faster lexical search via eager sparse scoring,题目翻译过来是&#xf…

【Android】手写笔适配

以下代码分别用于检测 是否为手写笔事件是否为橡皮擦事件是否为手写笔主按钮是否为手写笔辅按钮 override fun dispatchTouchEvent(event: MotionEvent): Boolean {val isStylus event.getToolType(event.actionIndex) MotionEvent.TOOL_TYPE_STYLUSval isEraser event.ge…