【Python笔记-设计模式】中介者模式

一、说明

中介者模式是一种行为设计模式,减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。

(一) 解决问题

降低系统中对象之间的直接通信,将复杂的交互转化为通过中介者进行的间接交互,从而解耦系统各部分,降低其耦合度。

(二) 使用场景

  • 当系统和对象之间存在复杂的交互关系,导致对象之间相互依赖、耦合度高,难以维护时
  • 当系统需要一个可复用的交互模块,用于多个对象之间的通信和协调时
  • 当想要将系统的控制逻辑集中管理、减少代码重复、提高代码可读性时

二、结构

  1. 组件(Component)是各种包含业务逻辑的类。每个组件都有一个指向中介者的引用,该引用被声明为中介者接口类型。组件不知道中介者实际所属的类,因此你可通过将其连接到不同的中介者以使其能在其他程序中复用。
  2. 中介者(Mediator)接口声明了与组件交流的方法,但通常仅包括一个通知方法。组件可将任意上下文(包括自己的对象)作为该方法的参数,只有这样接收组件和发送者类之间才不会耦合。
  3. 具体中介者(ConcreteMediator)封装了多种组件间的关系。具体中介者通常会保存所有组件的引用并对其进行管理,甚至有时会对其生命周期进行管理。
  4. 组件并不知道其他组件的情况。如果组件内发生了重要事件,它只能通知中介者。中介者收到通知后能轻易地确定发送者,这或许已足以判断接下来需要触发的组件了。对于组件来说,中介者看上去完全就是一个黑箱。发送者不知道最终会由谁来处理自己的请求,接收者也不知道最初是谁发出了请求。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
中介者模式例:实现一个简单的聊天室系统,其中中介者对象负责协调用户之间的消息传递
"""from abc import ABC, abstractmethodclass Mediator(ABC):"""中介者基类"""@abstractmethoddef send_message(self, sender, message):passclass ChatRoom(Mediator):"""具体中介者"""def __init__(self):self.users = []def add_user(self, user):self.users.append(user)def send_message(self, sender, message):for user in self.users:if user != sender:user.receive_message(message)class User(ABC):"""抽象组件类(用户)"""def __init__(self, name, mediator):self.name = nameself.mediator = mediator@abstractmethoddef send_message(self, message):pass@abstractmethoddef receive_message(self, message):passclass ChatUser(User):"""具体组件类(用户)"""def send_message(self, message):print(f"{self.name} 发送消息: {message}")self.mediator.send_message(self, message)def receive_message(self, message):print(f"{self.name} 收到消息: {message}")if __name__ == "__main__":"""张三 发送消息: 大家好!李四 收到消息: 大家好!------------------------------李四 发送消息: 你好,张三张三 收到消息: 你好,张三"""chat_room = ChatRoom()user1 = ChatUser("张三", chat_room)user2 = ChatUser("李四", chat_room)chat_room.add_user(user1)chat_room.add_user(user2)user1.send_message("大家好!")print("-" * 30)user2.send_message("你好,张三")

四、优缺点

优点

  • 降低系统耦合度:将对象之间的通信集中在中介者对象中,使得各个对象之间的关系变得简单明了,降低了对象之间的直接依赖和耦合度。
  • 提高系统的灵活性,使其便于扩展和维护:将对象之间的交互逻辑集中在中介者对象中,使得系统更加灵活,能够动态地改变对象之间的交互方式。

缺点

  • 中介者对象可能变得复杂:随着系统中对象之间的交互关系变的复杂,使中介者对象庞大复杂,导致管理和维护成本增加。
  • 中介者模式增加了系统的单点故障:由于系统中所有对象都依赖于中介者对象进行通信,因此中介者对象出现故障或性能问题时,可能会影响整个系统的正常运行。

【Python笔记】设计模式-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

热闹元宵进行中,如何利用VR全景展示民宿品牌形象?

错峰出游闹元宵,元宵节恰逢周末,而且还是春节假期返工之后的首个休息日,不少人都想通过短途度假来缓解“节后综合征”。两位数的特价机票、打折的各种酒店让你实现“旅行自由”,那么如何知道特价酒店服务好不好呢?先别…

VR转接器:破解虚拟与现实边界的革命性设备

VR转接器,这一革命性的设备,为虚拟现实体验带来了前所未有的自由度。它巧妙地连接了虚拟与现实,使得用户在享受VR眼镜带来的奇幻世界的同时,也能自由地在现实世界中活动。这一设计的诞生,不仅解决了VR眼镜续航的瓶颈问…

抖音短视频提取器|视频内容批量提取软件

抖音短视频提取器是一款功能强大的工具,旨在解决用户获取抖音视频时需要逐个复制链接、下载的繁琐问题。我们希望用户能够通过简单的关键词搜索,实现自动批量抓取视频,并根据需要进行选择性批量下载。基于C#开发的这款工具不仅支持通过关键词…

vscode——本地配置(C和C++)(1)

本地配置C和C(1) 什么是vscodevscode和visual studio的区别vscode的本地配置汉化 vscode配置C和C环境创建全局变量安装插件编写C或C程序生成task.json文件生成.exe文件 今天我们来看看一个开发工具——vscode。 什么是vscode 在正式了解vscode之前&…

【寸铁的刷题笔记】图论、bfs、dfs

【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁👊 金三银四,图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来!面试顺利上岸👋 喜欢的小伙伴可以点点关注 💝 🌞详见如下专栏🌞 &…

【办公类-21-04】20240227单个word按“段落数”拆分多个Word(三级育婴师操作参考题目 有段落文字和表格 1拆13份)

作品展示 背景需求: 最近学育婴师,老师发了一套doc操作参考 但是老师是一节节授课的,每节都有视频,如果做在一个文档里,会很长很长,容易找不到。所以我需要里面的单独文字的docx。 以前的方法是 1、打开源…

图论基础(一)

一、图论 图论是数学的一个分支,它以图为研究对象。图论中的图是若干给定的点(顶点)以及连接两点的线(边)构成的图像,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物&#xff0c…

mac电脑监控软件哪个好

在Mac电脑使用日益普及的今天,企业对于Mac终端的安全管理需求也日益增长。Mac电脑监控软件作为一种有效的管理工具,能够帮助企业提高数据安全性和员工工作效率。 在众多Mac电脑监控软件中,域智盾软件以其卓越的功能和性能脱颖而出&#xff0c…

仅用于个人记录:marine-anomaly-detection-main 多光谱海洋污染探测

一、给的源数据分析 GitHub - lucamarini22/marine-anomaly-detection: Semantic segmentation of marine anomalies using semi-supervised learning (FixMatch for semantic segmentation) on Sentinel-2 multispectral images. 二、wandb 使用教程 注册 权重与偏见&am…

Alist访问主页显示空白解决方法

文章目录 问题记录问题探索和解决网络方案问题探究脚本内容查看 最终解决教程 问题记录 访问Alist主页显示空白,按F12打开开发人员工具 ,选择控制台,报错如下 index.75e31196.js:20 Uncaught TypeError: Cannot assign to read only property __symbo…

Windows系统x86机器安装(麒麟、统信)ARM系统详细教程

本次介绍在window系统x86机器上安装国产系统 arm 系统的详细教程。 注:ubuntu 的arm系统安装是一样的流程。 1.安装环境准备。 首先,你得有台电脑,配置别太差,至少4核8G内存,安装window10或者11都行(为啥不能是Window7,你要用也不是不行,你先解决win7补丁更新问题)。…

Python手册(Machine Learning)--LightGBM

Overview LightGBM(Light Gradient Boosting Machine)是一种高效的 Gradient Boosting 算法, 主要用于解决GBDT在海量数据中遇到的问题,以便更好更快的用于工业实践中。 数据结构说明lightgbm.DatasetLightGBM数据集lightgbm.Bo…