当前位置: 首页 > news >正文

中介者模式:简化对象间通信的协调者

在面向对象的软件开发中,中介者模式是一种重要的行为型设计模式,用于降低多个对象间通信的复杂性。通过提供一个中心化的对象来处理不同组件之间的交互,中介者模式使得组件间不必显式引用彼此,从而使其松散耦合、更易于维护。本文将详细介绍中介者模式的定义、实现、应用场景以及优缺点。
在这里插入图片描述

1. 中介者模式的定义

中介者模式(Mediator Pattern)涉及一个中介对象,该对象封装了一系列对象间的交互方式。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,并且可以独立地改变它们之间的交互。

2. 实现中介者模式

在Python中,实现中介者模式通常涉及创建一个中介者类和一系列可以与中介者交互的组件类。以下是一个简单的中介者模式实现示例:

class Mediator(ABC):"""中介者接口,定义了用于通信的方法"""@abstractmethoddef notify(self, sender, event):passclass ConcreteMediator(Mediator):"""具体的中介者实现,协调多个组件之间的交互"""def __init__(self, component1, component2):self._component1 = component1self._component1.mediator = selfself._component2 = component2self._component2.mediator = selfdef notify(self, sender, event):if event == "A":print("Mediator reacts on A and triggers following operations:")self._component2.do_c()elif event == "D":print("Mediator reacts on D and triggers following operations:")self._component1.do_b()class BaseComponent:"""基础组件提供中介者的基础功能"""def __init__(self, mediator=None):self._mediator = mediator@propertydef mediator(self):return self._mediator@mediator.setterdef mediator(self, mediator):self._mediator = mediatorclass Component1(BaseComponent):"""具体组件1实现一些功能"""def do_a(self):print("Component 1 does A.")self.mediator.notify(self, "A")def do_b(self):print("Component 1 does B.")class Component2(BaseComponent):"""具体组件2实现一些功能"""def do_c(self):print("Component 2 does C.")def do_d(self):print("Component 2 does D.")self.mediator.notify(self, "D")# 客户端代码
c1 = Component1()
c2 = Component2()
mediator = ConcreteMediator(c1, c2)c1.do_a()
c2.do_d()

3. 中介者模式的应用实例

中介者模式在许多场景中非常有用,尤其适用于:

  • 用户界面开发:在复杂的用户界面中管理多个组件之间的交互。
  • 系统内部通信:如服务间的消息传递和事件处理系统。

4. 优点和缺点

优点:

  • 减少了类间的依赖,将一对多的依赖变成了一对一的依赖。
  • 中心化的控制交互逻辑,使得修改更加简单。

缺点:

  • 中介者可能会变得过于复杂,自身成为一个难以维护的庞大类。

5. 总结

中介者模式提供了一种有效的方式来减少多个组件间的直接交互,简化了系统的维护和扩展。正确使用这种模式可以提高系统的灵活性和可维护性,尤其在处理复杂的交互系统时表现出色。

更多Python编程相关文章:cpython666.github.io

http://www.lryc.cn/news/337902.html

相关文章:

  • 【Python系列】pydantic版本问题
  • 深度学习-多尺度训练的介绍与应用
  • 详解单文件组件
  • MLeaksFinder报错
  • 【心路历程】初次参加蓝桥杯实况
  • 微信小程序全屏开屏广告
  • 记录day1
  • stm32GPio的开发基础
  • DataSource
  • Linux防止暴力破解密码脚本
  • Unity 遮罩
  • jmeter实验 模拟:从CSV数据到加密请求到解密返回数据再到跨越线程组访问解密后的数据
  • 设计模式——外观(门面)模式10
  • 第七周周一人工智能导论预告
  • npm install 的不同选项:--save、--save-dev、-S、-D 的区别
  • 设计模式详解(十四)——策略模式
  • 【牛客SQL快速入门】SQL基础(二)
  • 利用Java代码调用Lua脚本改造分布式锁
  • 7/8电源连接器航空插头端子
  • 华为OD-C卷-游戏分组[100分]
  • 【c++】优先级队列|反向迭代器(vector|list)
  • gocron定时任务管理
  • JCYZ H3CNE-RS+
  • 太阳光光照试验耐久性老化试验使用太阳光模拟器系统
  • Centos 7.9.2009 下 Gitlab 完全卸载
  • Navicat Premium 16 for Mac/Win:数据库管理的全能之选
  • 使用腾讯云服务器如何搭建网站?新手建站教程
  • 抖音快手直播整蛊软件插件工具合集(多啦咪/梦歌)
  • 探究C++20协程(2)——取值、传值、销毁与序列生成器实现
  • 【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】