【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://xiahunao.cn/news/2813238.html

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

相关文章

新的一年,如何优化企业库存管理?

随着社会的发展和经济的不断增长,库存管理成为了企业运营中非常重要的一环。库存作为企业的资产之一,直接影响着企业的盈利能力和竞争优势。因此,对企业库存进行科学的分析和管理,成为了确保企业持续稳定发展的必要手段之一。企业…

设计模式(十) - 工厂方式模式

前言 在此前的设计模式(四)简单工厂模式中我们介绍了简单工厂模式,在这篇文章中我们来介绍下工厂方法模式,它同样是创建型设计模式,而且又有些类似,文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …

CentOS删除除了最近5个JAR程序外的所有指定Java程序

帮我写一个shell脚本,ps -eo pid,lstart,cmd --sort-start_time | grep "pgz-admin"查到的结果,返回的所有进程PID,第六个之上的,全部kill 当然,你可以创建一个简单的Shell脚本来完成这个任务。以下是一个例…

探索创造无限可能——Autodesk AutoCAD 2022(CAD 2022)系统要求

随着科技的不断进步和发展,计算机辅助设计(CAD)已经成为现代设计行业中不可或缺的一部分。在众多CAD软件中,Autodesk AutoCAD 2022(CAD 2022)无疑是最受欢迎和广泛应用的一款软件。作为一款全球领先的CAD软…

(十八)devops持续集成开发——使用docker安装部署jenkins服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins,选择一个最新稳定版本,避免一些插件不兼…

日更【系统架构设计师知识总结2】指令系统(结合真题)

【原创精华】结合老师的讲授、耗费三个小时的精华总结对正在备考的你一定有用!!自己一点点手打、总结的脑图,把散落在课本以及老师讲授的知识点合并汇总,反复提炼语言,形成知识框架。希望能给同样在学习的伙伴一点帮助…

如何理解介电常数与耗散因子

目录 电介质的极化过程 介电常数的定义 介电常数的物理意义 耗散因子的定义 耗散因子的物理意义 实际应用 结语 电介质的极化过程 电偶极子被定义为一对极性相反但相距很近的等量电荷,与每个偶极子相关联的一个矢量成为偶极矩,如果为每个电荷的带电量,为从负电荷到正电…

OpenHarmony开发之Stage模型卡片服务详解~

介绍 本示例展示了Stage模型卡片提供方的创建与使用。 用到了卡片扩展模块接口,ohos.app.form.FormExtensionAbility。 卡片信息和状态等相关类型和枚举接口,ohos.app.form.formInfo 。 卡片提供方相关接口的能力接口,ohos.app.form.form…

力扣● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

● 1049. 最后一块石头的重量 II 题目要把石头分成两堆,这两堆的重量差值最小。相撞之后剩下的石头重量就最小。其实就是要尽量把石头分为差不多重量的两堆,和昨天的● 416. 分割等和子集相似,这样就转换成了01背包问题。 和416题一样&…

【Git教程】(五)分支 —— 并行式开发,分支相关操作(创建、切换、删除)~

Git教程 分支 1️⃣ 并行式开发2️⃣ 修复旧版本中的 bug3️⃣ 分支4️⃣ 当前活跃分支5️⃣ 重置分支指针6️⃣ 删除分支7️⃣ 清理提交对象🌾 总结 对于版本提交为什么不能依次进行,以便形成一条直线型的提交历史记录,我们认为有 以下两个…

unity37——巧妙运用URP管线基础shader/Lit材质,给头发做出还不错的发丝效果.(应急用,在没时间单独写shader的情况下)

上面两个都是用基础Lit材质调整出来的。不管是,高模,还是低模。虽然没有单的的hair shader那么多可以做效果的滑块去调整效果,但是贵在简单、省事、建模容易、而且还省面。 下面上干货: 1。正常我们游戏里的头发,按照…

49.仿简道云公式函数实战-文本函数-Ip

1. Ip函数 获取当前用户的ip地址 注意是Ipv4的地址 2. 函数用法 IP() 3. 函数示例 获取当前用户的ip地址IP() 4. 代码实战 首先我们在function包下创建text包,在text包下创建IpFunction类,代码如下: package com.ql.util.express.sel…

弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙

作者:潘伟龙(豁朗) 背景 日志服务 SLS 是云原生观测与分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务,基于日志服务的便捷的数据接入能力,可以将系统日志、业务日志等接入 …

第十四届校模拟赛第一期(一)

“须知少时凌云志,自许人间第一流” 鄙人11月八号有幸参加学校校选拔赛,题型为5道填空题,5道编程题,总时间为4小时。奈何能力有限,只完成了5道填空和3道编程大题,现进行自省自纠,分享学习&#…

四 . 分支和循环——Java基础篇

四 . 分支和循环 1 . switch的基本语法 if 和 swicth 的对比: if既可以用于范围校验, 也可以用于等值校验swicth对于if效率更高,只能用于等值校验 语法格式: switch(表达式){case 常量值1:语句块1;//break;case 常量值2:语句块2;//break; // ...[default:语句块n1;break;] }…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

Wireshark TS | Linux 系统对时问题

问题描述 节前业务运维同事提交了一个 case ,说是部署在新业务区域的 Linux 服务器和老业务区域的 Linux 服务器无法对时,脚本里使用的是 clockdiff 命令,无法正常返回结果,而在老业务区域两台服务器之间执行命令就正常&#xff…

【笔记】深度学习入门:基于Python的理论与实现(三)

误差反向传播法 一 个能够高效计算权重参数的梯度的方法 计算图 正向传播 太郎在超市买了 2 个 100 日元一个的苹果,消费税是 10%,请计 算支付金额。 反向传播(导数) 如果苹果的价格增加某个微小值, 则最终的支付金额…

【JavaSE】实用类——String、日期等

目录 String类常用方法String类的equals()方法String中equals()源码展示 “”和equals()有什么区别呢? StringBuffer类常用构造方法常用方法代码示例 面试题:String类、StringBuffer类和StringBuilder类的区别?日期类Date类Calendar类代码示例…

Redis学习------实战篇----2024/02/27

1.导入项目 2.基于Session实现登录 手机验证码完整实现 /*** 发送验证码* param phone* param session* return*/Overridepublic Result sendCode(String phone, HttpSession session) {//1.校验手机号if(RegexUtils.isPhoneInvalid(phone)){//2.如果不符合,返回错…