设计模式(行为型模式)中介者模式

目录

    • 一、简介
    • 二、中介者模式
      • 2.1、中介者接口
      • 2.2、具体中介者
      • 2.3、同事对象
      • 2.4、使用
    • 三、优点与缺点

一、简介

  中介者模式(Mediator Pattern)是一种行为设计模式,旨在减少对象之间的直接通信,通过引入一个中介对象(中介者)来集中控制和协调这些对象之间的交互。中介者模式的定义如下:

  中介者模式指的是使用一个中介对象来封装一系列对象之间的交互,使得对象之间不再显式地相互引用,而是通过中介者对象来进行通信。这样一来,对象之间的耦合度降低,增加新对象也更加容易,因为它们不需要知道彼此的细节,只需了解中介者的接口即可。中介者模式包含以下主要角色:

  • 中介者(Mediator):定义了一个接口,用于各个同事对象之间的通信。
  • 具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个同事对象,并处理它们之间的交互关系。
  • 同事对象(Colleague):每个同事对象都知道中介者对象,与其他同事对象之间通过中介者对象进行通信。

  通过中介者模式,对象之间的通信被封装到中介者对象中,对象之间的直接联系减少,降低了耦合性,提高了代码的可维护性和灵活性。这种模式特别适用于对象之间的交互较复杂、互相依赖性较高的情况。

二、中介者模式

  当涉及实际的聊天室示例时,涉及到实时通信、用户界面等复杂性,这在文字交流中无法完全展示。以下是一个简化的 Java 示例,模拟了聊天室的基本功能,用于演示中介者模式的基本思想:

2.1、中介者接口

// 中介者接口
public interface ChatRoomMediator {void sendMessage(String message, User user);void addUser(User user);
}

2.2、具体中介者

import java.util.ArrayList;
import java.util.List;// 具体中介者 - 聊天室
public class ChatRoom implements ChatRoomMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void sendMessage(String message, User user) {for (User u : users) {// 排除发送者,向其他用户发送消息if (u != user) {u.receive(message);}}}@Overridepublic void addUser(User user) {users.add(user);}
}

2.3、同事对象

// 同事对象 - 用户
public class User {private String name;private ChatRoomMediator mediator;public User(String name, ChatRoomMediator mediator) {this.name = name;this.mediator = mediator;this.mediator.addUser(this);}public void send(String message) {mediator.sendMessage(message, this);}public void receive(String message) {System.out.println(name + " 接受的消息: " + message);}
}

2.4、使用

// 测试类
public class MediatorPatternExample {public static void main(String[] args) {ChatRoomMediator chatRoom = new ChatRoom();User user1 = new User("程咬金", chatRoom);User user2 = new User("妲己", chatRoom);User user3 = new User("赵子龙", chatRoom);user1.send("Hello, 我是程咬金!");user2.send("Hi, 妲己来了!");user3.send("Ha, 常山赵子龙在此!");}
}

运行结果:

妲己 接受的消息: Hello, 我是程咬金!
赵子龙 接受的消息: Hello, 我是程咬金!
程咬金 接受的消息: Hi, 妲己来了!
赵子龙 接受的消息: Hi, 妲己来了!
程咬金 接受的消息: Ha, 常山赵子龙在此!
妲己 接受的消息: Ha, 常山赵子龙在此!

  这个简化的示例展示了中介者模式在聊天室场景中的应用。ChatRoom 充当中介者,负责用户之间的消息分发;User 是同事对象,通过中介者发送消息。在测试类中,演示了用户发送消息并接收消息的过程。这个例子是一个简单的演示,实际的聊天室系统要复杂得多,包括实时通信、界面等功能。

三、优点与缺点

  中介者模式具有以下优点和缺点:

优点

  • 减少耦合度: 中介者模式可以减少对象之间的直接引用,使得对象之间的交互由中介者统一处理,降低了对象之间的耦合度。
  • 简化对象间交互: 通过中介者模式,对象之间的交互变得更加简单明了,各个对象只需要与中介者进行通信,而不需要了解其他对象的细节信息。
  • 易于扩展维护: 新增、删除或修改一个同事对象或中介者对象相对容易,由于对象之间的交互关系由中介者负责,可以更灵活地扩展和维护系统。
  • 集中控制逻辑: 中介者模式将交互逻辑集中到中介者对象中,易于控制和管理系统的逻辑。

缺点

  • 中介者过于复杂: 如果中介者承担了太多的职责,可能会变得过于复杂,导致中介者本身成为一个大而全的类,难以维护和理解。
  • 可能导致性能问题: 中介者模式可能导致性能问题,特别是当中介者对象变得庞大,处理逻辑复杂时,可能会影响系统的性能。

  总的来说,中介者模式适用于系统中对象之间的交互较为复杂、对象之间耦合度较高的场景。它能够有效地将对象之间的交互逻辑进行集中管理,但在使用过程中需要注意合理分配中介者的职责,避免中介者过于臃肿。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器库(5)-std::list

std::forward_list是可以从任何位置快速插入和移除元素的容器&#xff0c;不支持快速随机访问&#xff0c;支持正向和反向的迭代。 本文章的代码库&#xff1a; https://gitee.com/gamestorm577/CppStd 成员函数 构造、析构和赋值 构造函数 可以用元素、元素列表、迭代器…

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测 目录 多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-LSSVM卷积神经…

vue+vite项目,动态导入静态资源的几种方式

博主的桌面工具软件已经正式开发&#xff0c;获取方式&#xff1a; 可以关注我的小程序【中二少年工具箱】获取。&#xff08;若小程序更新有延迟&#xff0c;可先收藏小程序&#xff09; 通过下载链接 百度网盘: 链接&#xff1a;https://pan.baidu.com/s/15zDnSoEzJGSZLjpD…

跟着pink老师前端入门教程-day20

二、移动WEB开发之flex布局 1、flex 布局体验 1.1 传统布局与flex布局 传统布局&#xff1a;兼容性好、布局繁琐、局限性、不能再移动端很好的布局 flex弹性布局&#xff1a;操作方便&#xff0c;布局极为简单&#xff0c;移动端应用很广泛&#xff1b;PC 端浏览器支持情况…

SpringbootV2.6整合Knife4j 3.0.3 问题记录

参考 https://juejin.cn/post/7249173717749940284 近期由于升级到springboot2.6X&#xff0c;所以服务端很多组件都需要重新导入以及解决依赖问题。 下面就是一个很经典的问题了&#xff0c; springboot2.6与knife4j的整合。 版本对应 springboot2.6与knife4j 3.0.3 坑 …

如何使用postman进行接口调试

使用Postman进行接口调试 有些时候我们写代码的时候&#xff0c;会发现接口有报错&#xff0c;提示参数错误&#xff0c;我们为了更好的排查错误原因&#xff0c;可以在Postman上进行接口调试。将url&#xff0c;请求方式&#xff0c;参数&#xff0c;cookie都填写到Postman中…

c++二叉树寒假特训题目(1)

大家好&#xff0c;我是周曦&#xff0c;今天给大家推荐一些二叉树题目。 题目 二叉树存储 这道题是道水题&#xff0c;找找规律ok&#xff0c;本人代码10行。 淘汰赛 这道题推荐使用桶数组 做比较合适&#xff08;就是有点绕&#xff09;。 二叉树深度 这题是一道深搜题&a…

eclipse使用google的Java代码格式

插件下载地址 1.下载eclipse的插件 2.下载的jar包放到eclipse安装目录的dropins文件夹 D:\install_package\STS\sts-4.10.0.RELEASE\dropins&#xff13;.重启后设置 eclipse - windows - preference - java - code style - formatter -

MySQL篇----第十二篇

系列文章目录 文章目录 系列文章目录前言一、可以使用多少列创建索引?二、NOW()和 CURRENT_DATE()有什么区别?三、什么是非标准字符串类型?四、什么是通用 SQL 函数?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转…

【蓝桥杯冲冲冲】Invasion of the Milkweed G

【蓝桥杯冲冲冲】Invasion of the Milkweed G 蓝桥杯备赛 | 洛谷做题打卡day30 文章目录 蓝桥杯备赛 | 洛谷做题打卡day30[USACO09OCT] Invasion of the Milkweed G题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题解代码我的一些话 [USACO09OCT] Invasion of the Mi…

2024/2/6

一、填空题 1、一个类的头文件如下所示&#xff0c;num初始化值为5&#xff0c;程序产生对象T&#xff0c;且修改num为10&#xff0c;并使用show()函数输出num的值10。 #include <iostream.h> class Test { private: static int num; public: Test(int); void sho…

linux centos 安装teleport

效果 安装 1.创建目录 mkdir -p /opt/teleport/data cd /opt/teleport/2.下载解压文件 wget https://tp4a.com/static/download/teleport-server-linux-x64-3.6.4-b3.tar.gz tar -xvf teleport-server-linux-x64-3.6.4-b3.tar.gz3.安装 cd /opt/teleport/teleport-server-l…

Python学习路线 - Python高阶技巧 - 拓展

Python学习路线 - Python高阶技巧 - 拓展 闭包闭包注意事项 装饰器装饰器的一般写法(闭包写法)装饰器的语法糖写法 设计模式单例模式工厂模式 多线程进程、线程并行执行多线程编程threading模块 网络编程Socket客户端和服务端Socket服务端编程实现服务端并结合客户端进行测试 S…

Leveraging Jexl in JavaScript: Practical Scenarios and Code Examples

JavaScript Expression Language (Jexl) is a powerful library that allows developers to safely evaluate expression strings against a context object. It’s incredibly useful for scenarios where there’s a need to dynamically evaluate expressions based on chan…

D音等短视频为什么这么吸引人?长期沉迷刷D音的危害 彻底戒掉刷D音上瘾 占用大量时间 注意力分散 思维浅薄 焦虑、抑郁 干扰睡眠 视力疲劳

这是你吗&#xff1f; 人生最爽的事是&#xff1a;刷痘印。 人生最不爽的事是&#xff1a;刷完&#xff0c;什么也没有得到&#xff0c;事也没做。 吸引法则 1. 内容碎片化&#xff0c;符合快节奏时代需求 短视频的时长通常只有几秒到十几分钟&#xff0c;内容简短精悍&…

苹果macbook电脑删除数据恢复该怎么做?Mac电脑误删文件的恢复方法

苹果电脑删除数据恢复该怎么做&#xff1f;Mac电脑误删文件的恢复方法 如何在Mac上恢复误删除的文件&#xff1f;在日常使用Mac电脑时&#xff0c;无论是工作还是娱乐&#xff0c;我们都会创建和处理大量的文件。然而&#xff0c;有时候可能会不小心删除一些重要的文件&#x…

Spring Boot3,启动时间缩短 10 倍!

前面松哥写了一篇文章和大家聊了 Spring6 中引入的新玩意 AOT&#xff08;见Spring Boot3 新玩法&#xff0c;AOT 优化&#xff01;&#xff09;。 文章发出来之后&#xff0c;有小伙伴问松哥有没有做性能比较&#xff0c;老实说&#xff0c;这个给落下了&#xff0c;所以今天…

保单受益人如何填?

受益人就是保险公司发生赔付&#xff0c;收到钱的那个人。受益人填不好&#xff0c;可能会导致亲人反目。 受益人分为生存受益人和身故受益人。 生存受益人就是被保险人活着能拿钱的人&#xff0c;医疗险&#xff0c;重疾险&#xff0c;意外险一般都会用到生存受益人。 一般…

Linux的计划任务(crontab)环境变量问题解决

1、背景 新上了个python服务&#xff0c;里面有调用oracle&#xff0c;其中有个需求需要定时去调用&#xff0c;贪方便想用crontab&#xff0c;出现了环境变量问题&#xff0c;于是跟他杠上了&#xff0c;势必要解决它&#xff01; 2、现象 尽管我在计划任务里写全了脚本路径…

使用 KITTI数据集训练YOLOX

1. 现在KITTI集后&#xff0c;首先将数据集转换为COCO数据集格式。 kitti_vis.py import os from pathlib import Path import numpy as np import cv2def anno_vis(img, anno_list):for anno in anno_list:points np.array(anno[4:8], dtypenp.float32)cv2.rectangle(img, (…