当前位置: 首页 > news >正文

设计模式——中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,它旨在减少多个对象之间的相互引用和耦合度。通过引入一个中介对象来封装一系列交互行为,使得原本复杂的网状关系结构转变为星形结构,所有对象与中介者通信而不是彼此直接通信。

原理

  • 抽象中介者(Mediator Interface): 定义了各个同事类(Colleague)与中介者之间进行交互的接口。
  • 具体中介者(Concrete Mediator): 实现了抽象中介者的接口,并持有对所有同事类的引用,负责协调它们之间的交互逻辑。
  • 同事类(Colleague Classes): 每个同事类都知道中介者并与其通信,但不知道其他同事类的具体细节。

Java代码示例

// 抽象中介者接口
public interface ChatMediator {void sendMessage(User user, String message);void addUser(User user);void removeUser(User user);
}// 具体中介者 - 聊天室实现
public class ChatRoom implements ChatMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void sendMessage(User user, String message) {for (User colleague : users) {if (!colleague.equals(user)) {colleague.receiveMessage(user.getName(), message);}}}@Overridepublic void addUser(User user) {users.add(user);System.out.println(user.getName() + "加入了聊天室");}@Overridepublic void removeUser(User user) {users.remove(user);System.out.println(user.getName() + "离开了聊天室");}
}// 同事类 - 用户
public class User {private String name;private ChatMediator mediator;public User(String name, ChatMediator mediator) {this.name = name;this.mediator = mediator;mediator.addUser(this);}public void sendMessage(String message) {mediator.sendMessage(this, message);}public void receiveMessage(String from, String message) {System.out.println("[" + from + "] -> [" + this.name + "]: " + message);}public String getName() {return name;}
}// 使用示例
public class Client {public static void main(String[] args) {ChatMediator chatRoom = new ChatRoom();User alice = new User("Alice", chatRoom);User bob = new User("Bob", chatRoom);alice.sendMessage("你好,Bob!");bob.sendMessage("你好,Alice!");}
}

想象一下你在一个朋友聚会上,大家想要交流却不能大声喊叫以免打扰到其他人。这时主持人(中介者)就起到了关键作用,他接收每个人的话并传递给其他人。在这个场景中,参与者(同事类)只需告诉主持人他们的信息,无需直接与其他所有人交谈,这样简化了沟通流程且降低了混乱程度。

应用场景

  • 聊天系统:每个用户是一个同事类,聊天室是中介者,用户之间通过聊天室发送消息,而不需要知道对方用户的详细信息。
  • 用户界面组件:按钮、文本框等组件都是同事类,事件管理器作为中介者处理不同组件间的事件触发和响应。

适用性

  • 多个对象之间存在复杂交互关系,形成了“网状”依赖结构。
  • 当需要改变或扩展对象间交互时,不想修改大量已有的对象类。
  • 需要集中控制和协调对象之间的交互行为。

相关文章:

  • Docker 仓库管理
  • etcd v3用户权限操作
  • 基于FPGA的万兆以太网学习(1)
  • openssl3.2 - 官方demo学习 - mac - siphash.c
  • 垃圾收集器G1ZGC详解
  • x-www-form-urlencoded接收方式代码示例
  • Nodejs 问题排查
  • openssl3.2 - 官方demo学习 - smime - smdec.c
  • Angular系列教程之观察者模式和RxJS
  • 【备战蓝桥杯】图的遍历问题
  • openssl3.2 - 官方demo学习 - smime - smsign2.c
  • JavaEE之多线程编程:3. 线程的状态(易懂!)
  • 【项目搭建二】SpringBoot引入druid、mybatis、mybatisPlus
  • 【Docker】Nacos的单机部署及集群部署
  • 位运算的高频算法题(算法村第十一关白银挑战)
  • django开发-定时任务的使用
  • ECMAScript入门(七)--Module语法
  • magento 货币换算
  • MaxCompute访问TableStore(OTS) 数据
  • pdf文件如何在线转换为jpg图片
  • Phpstorm怎样批量删除空行?
  • Python3爬取英雄联盟英雄皮肤大图
  • SegmentFault 2015 Top Rank
  • Vue.js 移动端适配之 vw 解决方案
  • windows-nginx-https-本地配置
  • 程序员该如何有效的找工作?
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 番外篇1:在Windows环境下安装JDK
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 聚簇索引和非聚簇索引
  • 类orAPI - 收藏集 - 掘金
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 面试总结JavaScript篇
  • 前端性能优化——回流与重绘
  • 前端自动化解决方案
  • 使用agvtool更改app version/build
  • 线性表及其算法(java实现)
  • 译有关态射的一切
  • 正则与JS中的正则
  • ​Spring Boot 分片上传文件
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • $jQuery 重写Alert样式方法
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (pojstep1.3.1)1017(构造法模拟)
  • (八)Spring源码解析:Spring MVC
  • (差分)胡桃爱原石
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Sublime Text3配置Lua运行环境
  • . NET自动找可写目录