【python设计模式】18、仲裁者模式

news/2025/3/15 1:02:17/

哲学思想:

仲裁者模式是一种软件设计模式,它的哲学思想是将对象之间的交互行为转移到第三方对象,以避免直接耦合。该模式的核心思想是:当对象之间需要通信时,它们不直接相互交互,而是通过一个中介者对象来进行通信。这种中介者对象被称为仲裁者,因为它负责协调和解决对象之间的冲突,从而实现对象之间的松耦合。

简介:

仲裁者模式是一种行为设计模式,它通过使用一个仲裁者对象来协调一组对象之间的交互。在该模式中,对象之间的交互不再直接进行,而是通过仲裁者对象进行协调。

在仲裁者模式中,一组对象将自己的引用传递给仲裁者对象,仲裁者对象负责处理这些对象之间的通信。当一个对象需要与其他对象交互时,它将请求发送给仲裁者对象,由仲裁者对象将请求转发给其他对象。

使用仲裁者模式可以使对象之间的交互更加灵活和可维护。它可以降低对象之间的耦合性,使得对象之间的交互更加松散。同时,它也可以使系统更加可扩展和可重用。

在实际应用中,仲裁者模式经常被用于构建复杂的用户界面,以及在分布式系统中协调不同节点之间的通信。

优点:

  1. 降低耦合性:仲裁者模式可以将对象之间的交互进行解耦,使得它们更加独立和可维护。

  2. 提高可扩展性:由于仲裁者对象负责协调对象之间的交互,因此可以更加方便地添加、删除或替换对象。

  3. 促进重用性:通过将通用的协调逻辑集中在仲裁者对象中,可以使得这些逻辑更加容易被重用。

  4. 简化维护:仲裁者模式可以将复杂的交互逻辑集中在一个地方,使得代码更加清晰易懂,便于维护。

  5. 降低系统复杂度:通过将对象之间的通信集中在仲裁者对象中,可以使得系统的架构更加简单明了。

缺点:

  1. 过度集中化:由于仲裁者对象负责协调所有对象之间的交互,因此可能会导致过度集中化,使得系统变得复杂和难以维护。

  2. 系统性能:仲裁者模式需要一个额外的对象来协调所有对象之间的交互,可能会对系统性能造成影响。

  3. 调试困难:由于所有对象之间的通信都由仲裁者对象进行协调,因此当出现问题时,很难确定是哪个对象出了问题。

  4. 可扩展性问题:如果系统中的对象之间的关系比较复杂,可能需要大量的仲裁者对象来协调它们之间的交互,这可能会导致系统的可扩展性问题。

实际应用场景:

  1. 聊天室系统:在聊天室中,每个用户都可以发送消息,而其他用户也可以接收到这些消息。这个过程中需要一个中介者,即聊天室系统,来协调用户之间的交互,例如,将消息广播给所有在线的用户。

  2. MVC架构中的Controller:在MVC架构中,Controller扮演了一个中介者的角色,它接收来自View的请求并处理它们,然后将结果返回给View。

  3. 航空控制系统:在一个繁忙的航空控制系统中,多个飞机需要在同一空域内运行,并避免相互碰撞。这个过程中需要一个中介者,即航空控制系统,来协调飞机之间的交互,例如,调整飞行高度和航线。

  4. 交通信号灯系统:在城市中的交通信号灯系统中,交通信号灯扮演了一个中介者的角色,它协调了车辆和行人之间的交互,通过控制信号灯的颜色和时间来控制交通流量。

  5. 电子商务平台:在一个电子商务平台中,买家和卖家之间需要进行交易,并通过平台来实现交易。这个过程中需要一个中介者,即电子商务平台,来协调买家和卖家之间的交互,例如,处理订单、支付和退款等事务。

代码实现:

以下是一个简单的仲裁者模式的 Python 代码实现,假设我们有两个对象 A 和 B,它们需要协调它们之间的交互:

class Mediator:def __init__(self, a, b):self.a = aself.b = bdef notify(self, sender, event):if sender == self.a:self.b.handle_event(event)elif sender == self.b:self.a.handle_event(event)class ColleagueA:def __init__(self, mediator):self.mediator = mediatordef send_event(self, event):self.mediator.notify(self, event)def handle_event(self, event):print("Colleague A handling event:", event)class ColleagueB:def __init__(self, mediator):self.mediator = mediatordef send_event(self, event):self.mediator.notify(self, event)def handle_event(self, event):print("Colleague B handling event:", event)# 创建中央仲裁者对象
mediator = Mediator(None, None)# 创建ColleagueA和ColleagueB对象
colleague_a = ColleagueA(mediator)
colleague_b = ColleagueB(mediator)# 设置中央仲裁者对象的a和b属性
mediator.a = colleague_a
mediator.b = colleague_b# 对象 A 发送事件
colleague_a.send_event("event 1")# 对象 B 发送事件
colleague_b.send_event("event 2")

在这个例子中,我们创建了一个 Mediator 类作为中央仲裁者对象,并将两个对象 ColleagueAColleagueB 的实例传递给它。当一个对象发送事件时,它会调用中央仲裁者对象的 notify 方法,并将自己作为发送方传递给它。中央仲裁者对象会根据发送方的身份调用另一个对象的 handle_event 方法来处理事件。

在主程序中,我们首先创建了中央仲裁者对象,然后让对象 ColleagueA 发送一个事件,然后让对象 ColleagueB 发送另一个事件。输出结果如下:

Colleague A handling event: event 1
Colleague B handling event: event 2

可以看到,两个对象之间的交互是通过中央仲裁者对象进行的,它们并不需要直接交互。这样做的好处是,如果需要增加更多的对象,只需要将它们的实例传递给中央仲裁者对象即可,而不需要修改对象之间的交互逻辑。


http://www.ppmy.cn/news/39418.html

相关文章

电脑+浏览器——黑色护眼

电脑浏览器——黑色护眼电脑办公Excel主题,黑色表格,黑色背景电脑办公 Excel https://www.kewenba.com/12562.html 主题,黑色 表格,黑色背景 【页面布局】-【背景】,然后选择一张黑色图片

web基础

web基础 与http 域名:由于IP地址不易记忆,域名用来代替IP地址, (DNS)服务与配置:先在本地hosts里去找,然后在本地域名服务器递归查找,本地域名服务器在一级二级按域名长度迭代查找后…

STM32F4_串口通信详解

目录 1. 串口相关介绍及使用 1.1 串口设置的一般步骤: 1.1.1 串口时钟和GPIO时钟使能 1.1.2 设置引脚复用器映射 1.1.3 GPIO端口模式设置 1.1.4 串口参数初始化 1.1.5 开启中断并且初始化NVIC,使能中断 1.1.6 使能串口 1.1.7 串口数据发送与接收…

java基础之抽象类与接口

文章目录1.抽象方法和抽象类2.抽象类的作用3.接口4.接口和抽象类的异同5.面向接口编程1.抽象方法和抽象类 抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。 抽象类必须使用abstract修饰符来…

咖啡业:混战不止

配图来自Canva可画 不知不觉间,作为舶来品的咖啡已经深入到人们的日常生活中,尤其是对于上班族而言,咖啡更是成为了提神醒脑的一大“利器”,因此,大街小巷出现了越来越多咖啡店的身影。而随着消费者消费观念的不断改变…

pt05Encapsulationinherit

Encapsulation &inherit 封装继承 封装 向类外提供必要的功能,隐藏实现的细节, 代码可读性更高优势:简化编程,使用者不必了解具体的实现细节,只需要调用对外提供的功能。私有成员:作用:无需向类外提供…

有效的数独(数组)

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) …

ChatGPT的技术路线

目录ChatGPT的技术路线基于 GPT-3.5,GPT-4 预计提升更明显GPT、Bert 均源自 Transformer 模型领先的 NLP 模型RLHF 与 TAMER 是重要架构支撑ChatGPT的技术路线 基于 GPT-3.5,GPT-4 预计提升更明显 ChatGPT 是基于 GPT-3.5 的主力模型。在互联网开源数据…