设计模式:中介者模式

news/2024/9/24 21:18:46/

中介者模式定义

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个第三方对象(中介者)来管理一组对象之间的复杂交互。这些对象通过中介者而不是直接相互通信,从而减少了它们之间的耦合度,使得代码易于维护和扩展。

应用场景

  • 当多个对象之间的交互形成了网状结构,每个对象都需要了解其他对象,导致系统难以理解和维护时。
  • 当对象间的交互需要被封装在一起,从而独立于这些对象的交互,使得调整和管理交互更加容易时。
  • 当一个系统中对象之间的交互行为是可变的,但又不希望在对象间建立太多的连接时。

示例代码

假设我们有一个简单的聊天室应用,用户可以发送消息给聊天室中的其他用户。在这个例子中,聊天室充当中介者的角色。

中介者接口及其实现

java">// 中介者接口
interface ChatMediator {void sendMessage(String msg, User user);void addUser(User user);
}// 聊天室实现
class ChatRoom implements ChatMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void sendMessage(String msg, User user) {for (User u : users) {// 消息不应该被发送者接收if (u != user) {u.receive(msg);}}}@Overridepublic void addUser(User user) {this.users.add(user);}
}

用户类

java">abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator med, String name) {this.mediator = med;this.name = name;}public abstract void send(String msg);public abstract void receive(String msg);
}class ConcreteUser extends User {public ConcreteUser(ChatMediator med, String name) {super(med, name);}@Overridepublic void send(String msg) {System.out.println(this.name + ": Sending Message=" + msg);mediator.sendMessage(msg, this);}@Overridepublic void receive(String msg) {System.out.println(this.name + ": Received Message:" + msg);}
}

客户端代码

java">public class MediatorPatternDemo {public static void main(String[] args) {ChatMediator mediator = new ChatRoom();User user1 = new ConcreteUser(mediator, "John");User user2 = new ConcreteUser(mediator, "Doe");User user3 = new ConcreteUser(mediator, "Smith");User user4 = new ConcreteUser(mediator, "Alice");mediator.addUser(user1);mediator.addUser(user2);mediator.addUser(user3);mediator.addUser(user4);user1.send("Hi All");}
}

原则间的权衡与冲突

  • 开闭原则:中介者模式提高了系统的可扩展性。新增加的交互可以通过修改中介者或增加新的中介者来实现,而无需修改原有的对象。
  • 单一职责原则:中介者承担了协调各个对象间交互的职责,从而使得对象本身不需要直接交互,符合单一职责原则。

设计模式的局限性

  • 中介者模式可能会导致中介者对象本身变得过于复杂,集中了太多的交互逻辑,难以维护。
  • 过度使用中介者模式可能会导致系统中的部分逻辑变得难以追踪和理解,特别是当中介者负责的交互非常多时。

总结与建议

中介者模式是一种有效的方式来减少类之间的直接交互,降低系统的耦合度。它特别适合用于管理复杂的交互和通信。在使用中介者模式时,应该注意不要让中介者类变得过于庞大和复杂。合理地划分中介者的职责,并在必要时拆分中介者,可以帮助维护中介者模式的清晰性和可维护性。


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

相关文章

遥瞻智慧:排水系统远程监控的卓越解决方案

遥瞻智慧&#xff1a;排水系统远程监控的卓越解决方案 在城市脉络的深层肌理中&#xff0c;排水系统犹如一条条隐秘的生命线&#xff0c;默默承载着城市的呼吸与律动。然而&#xff0c;如何以科技之眼&#xff0c;赋予这些无形网络以实时感知、精准调控的能力&#xff0c;使之…

ASP.NET基于SVG的自动站雨量分析系统

摘 要 SVG是由W3C组织开发的基于可扩展标记语言的一种矢量图形描述语言&#xff0c;已经在互联网上得到了较广泛的应用。为了以图形方式直观地显示雨量数据变化&#xff0c;方便工作人员进行雨量数据的查询及分析&#xff0c;设计了本套基于SVG的雨量分析系统。 该自动站雨量…

介绍TCP窗口

在TCP通信中&#xff0c;TCP窗口是用于控制发送方发送数据的速率的机制之一。TCP窗口大小会根据网络情况和接收方的处理能力进行动态调整&#xff0c;以最大化网络吞吐量并减少拥塞和丢包的风险。 当发送方以较快速度发送TCP数据包时&#xff0c;TCP窗口大小可能会自动调整&am…

移植speexdsp到OpenHarmony标准系统⑥

九、准备好上传speexdsp至OpenHarmony仓库。 移植完成后&#xff0c;先将代码上传至sig仓中的contest仓 sig仓库是TPC仓库的孵化仓。代码先上sig仓&#xff0c;到时会直接平移到tpc仓。 上传的内容包括&#xff1a; 原生库代码 &#xff08;除了涉及需要修改原生库代码的部分…

std::deque/std::vector/std::list

效率 STL容器—deque使用技巧_std::deque 高级用法-CSDN博客

Docker搭建Emby

Emby是一款媒体服务器应用程序&#xff0c;与Plex和Kodi等服务类似&#xff0c;它允许用户整理个人媒体库&#xff08;包括视频、音频和图片&#xff09;&#xff0c;并通过网络流式传输到各种设备上。用户可以在家庭网络内或通过互联网远程访问媒体库&#xff0c;Emby还能自动…

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr 主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。 特征&#xff1a;图标识别 端口&#xff1a;8393 CVE-2019-0193&#xff08;远程命令执行漏洞&#xff09; 漏洞版本&#xff1a;Apache Solr < 8.2.0 利用条件&#xff1a; Apache Solr 的 DataImportHandler 启…

自动化_Ansible学习笔记

文章目录 Ansible 介绍配置文件主配置文件优先级 常用命令ansible-playbook ad-hocinventory 主机清单Playbook 剧本YAML格式 ansible 模块介绍模块对应功能Commands modules(命令模块)command (命令)shell (外壳) 官方帮助文档 模块索引playbook 开头示例系统类setup (收集远程…