设计模式之中介者模式

embedded/2024/12/23 5:25:24/

详细介绍

        中介者模式(Mediator Pattern)是一种行为设计模式它通过定义一个中介类来封装多个对象之间的交互,使各对象不需要显示地相互引用,从而降低耦合度,提高系统的可维护性和灵活性。中介者模式将原本一对多的网状关系转变为一对多的关系,即每个对象只与中介者对象通信,而中介者负责将消息转发给正确的对象,从而实现对象之间的解耦。 

核心组件:

  • Mediator(中介者):定义一个接口,用于声明所有同事对象需要调用的中介方法。
  • ConcreteMediator(具体中介者):具体实现中介者接口,协调各个同事对象的交互,维持同事对象间的松耦合关系。
  • Colleague(同事):定义一个接口,声明同事对象所知道的中介者。每个同事只知道中介者而不知道其他同事的存在。
  • ConcreteColleague(具体同事):实现同事接口,实现自身业务逻辑,并通过中介者与其他同事通信。

使用场景

  1. 多个对象间存在复杂的相互依赖关系:当多个对象之间的直接交互复杂且难以管理时,可以使用中介者模式来简化对象间的通信。
  2. 需要降低对象间的耦合度:通过引入中介者,可以避免对象间的直接引用,从而降低系统的耦合度。
  3. 需要集中控制交互:当需要对一组对象的交互进行集中管理时,中介者模式可以提供一个中心控制点。

注意事项

  1. 中介者不应知道所有同事的详细信息:中介者应该只了解它需要协调的交互细节,而不必知道同事的具体实现。
  2. 避免过度集中:过度集中所有的交互到一个中介者可能会导致中介者本身变得过于复杂,考虑使用多个中介者来分解复杂性。
  3. 性能考量:中介者作为消息的中转站,频繁的调用可能会成为性能瓶颈,需注意优化。

优缺点

优点:

  • 降低耦合度:同事之间不直接通信,减少了相互依赖。
  • 简化对象间通信:通过中介者统一管理交互,简化了系统结构。
  • 易于维护和扩展:新增或修改同事类时,只需修改中介者即可,不影响其他同事。

缺点:

  • 中介者可能会变得复杂:随着系统复杂度增加,中介者可能需要处理越来越多的交互逻辑。
  • 不适用简单场景:对于简单的对象交互,引入中介者可能会造成不必要的复杂度。

Java代码示例

假设有一个聊天室系统,包含用户(User)和聊天室(ChatRoom)两种角色。

java">// 同事接口
interface Colleague {void receiveMessage(String message, Colleague sender);void sendMessage(String message);
}// 具体同事:用户
class User implements Colleague {private String name;private ChatRoom chatRoom;public User(String name, ChatRoom chatRoom) {this.name = name;this.chatRoom = chatRoom;}@Overridepublic void receiveMessage(String message, Colleague sender) {System.out.println(name + " received message from " + ((User)sender).getName() + ": " + message);}@Overridepublic void sendMessage(String message) {chatRoom.sendMessage(this, message);}public String getName() {return name;}
}// 中介者:聊天室
class ChatRoom implements Mediator {@Overridepublic void sendMessage(Colleague sender, String message) {for (Colleague colleague : users) {if (!colleague.equals(sender)) {colleague.receiveMessage(message, sender);}}}private List<Colleague> users = new ArrayList<>();public void addUser(User user) {users.add(user);}
}// 使用示例
public class MediatorPatternDemo {public static void main(String[] args) {ChatRoom chatRoom = new ChatRoom();User john = new User("John", chatRoom);User jane = new User("Jane", chatRoom);chatRoom.addUser(john);chatRoom.addUser(jane);john.sendMessage("Hello, Jane!");jane.sendMessage("Hi, John! How are you?");}
}

使用过程中可能遇到的问题

  1. 中介者过于庞大:当中介者变得庞大和复杂时,可以考虑分解为多个小的中介者,或者引入更多的抽象层次。
  2. 过度集中控制:为了减少中介者负担,可以适当让一些简单的交互直接在同事间发生,仅将复杂的交互逻辑委托给中介者处理。

与其他模式的对比

  • 与观察者模式:两者都涉及对象间的通信,但观察者模式强调一对多的发布-订阅机制,而中介者模式更侧重于简化对象间的直接通信,控制复杂交互。
  • 与外观模式:外观模式为子系统提供一个统一的接口,隐藏子系统的复杂性;而中介者模式关注于协调一组对象之间的交互,降低它们之间的耦合度。
  • 与策略模式:策略模式关注于定义一系列算法,并在运行时选择其中一个算法执行。虽然两者都实现了行为的封装,但中介者模式更侧重于管理对象间的交互,而不是算法的替换。


http://www.ppmy.cn/embedded/23448.html

相关文章

后端面试---分布式微服务

分布式&微服务 分布式1、什么时候用到分布式开发三级目录 微服务 分布式 1、什么时候用到分布式开发 三级目录 微服务 1、谈谈你对微服务的理解&#xff0c;什么时候用微服务 2、若A服务请求B服务B1接口&#xff0c;B1接口又请求A服务的A2接口&#xff0c;会不会有问题…

微信小程序:基于MySQL+Nodejs的汽车品牌管理系统

各位好&#xff0c;接上期&#xff0c;今天分享一个通过本地MySQLNodejs服务器实现CRUD功能的微信小程序&#xff0c;一起来看看吧~ 干货&#xff01;微信小程序通过NodeJs连接MySQL数据库https://jslhyh32.blog.csdn.net/article/details/137890154?spm1001.2014.3001.5502 …

前端开发攻略---用原生JS在网页中也能实现文本转语音

1、原理 语音合成 (也被称作是文本转为语音&#xff0c;英语简写是 tts) 包括接收 app 中需要语音合成的文本&#xff0c;再在设备麦克风播放出来这两个过程。 Web API中对此有一个主要控制接口 SpeechSynthesis&#xff0c;外加一些处理如何表示要被合成的文本 (也被称为 utte…

react挂载后函数

在React中&#xff0c;当组件被挂载到DOM后&#xff0c;你可以使用生命周期方法 componentDidMount() 来执行某些操作。这是React组件生命周期中的一个重要阶段&#xff0c;此时组件已经被渲染并插入到DOM中。 componentDidMount() 是一个在组件输出到DOM后立即自动调用的方法…

Redux(类似vue中的vuex和pina)

什么是Redux Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行 作用&#xff1a;通过集中管理的方式管理应用的状态 为什么要使用Redux&#xff1f; 独立于组件&#xff0c;无视组件之间的层…

python初级笔记5 面向对象

创造类的方式 class 类名&#xff08;object&#xff09;&#xff1a; 属性 方法 类名用大驼峰命名法 函数在类中叫做方法 类名后面的括号用来继承 class Student(object):name Noneage Noneid Noneprint(Student) 结果&#xff1a; E:\Python\python.exe E:\学习笔记\Py…

Vue 3 快速上手指南(第二期)

&#x1f4da; Vue 3 快速上手指南 在本文中&#xff0c;我将介绍 Vue 3 的基础知识&#xff0c;我们将了解 1.setup &#x1f4da; 如果你想深入学习 Vue 3&#xff0c;建议阅读官方文档并尝试更复杂的示例和项目。 &#x1f449; 可以通过以下链接访问 Vue 3 官方文档&#x…

初识计算机网络

端系统 "端系统"是指网络中的终端设备或主机&#xff0c;它们是网络通信的起始点和终点。端系统可以是个人计算机、服务器、路由器、智能手机、平板电脑等各种设备&#xff0c;它们通过网络连接进行通信和数据交换。 在因特网中&#xff0c;端系统通过网络协议&#…