【设计模式】中介模式

目录

什么是中介模式

中介模式的组成

使用场景:

优点:

缺点:

Java 示例代码:


什么是中介模式

Java 中的中介模式(Mediator Pattern)是一种行为型设计模式,旨在降低多个对象和类之间的通信复杂性。通过这种模式,对象之间不直接通信,而是通过一个中介对象来协调他们之间的交互。这有助于减少系统中组件的相互依赖性,从而提高组件的可重用性和可维护性。

中介模式的组成

  1. 中介者接口(Mediator):定义了用于通信的方法,可以是接口或抽象类。
  2. 具体中介者(Concrete Mediator):实现中介者接口,并协调多个不同组件之间的交互。具体中介者知道所有的具体同事类,并从具体同事接收消息,向它们发送命令。
  3. 同事类(Colleague):与其他对象交互时,不是直接通信,而是通过中介者来交互。

使用场景:

  • 当多个类相互交互形成网状结构时,使用中介模式可以将网状结构转化为以中介者为核心的星型结构。
  • 减少类之间的依赖,降低耦合度。
  • 当一个对象群的行为是互相协作的紧密型群体时,可以通过中介者封装这些交互。

优点:

  • 减少了类间的直接通讯,降低了系统的复杂性。
  • 有助于单一职责原则,可以将交互的管理和协调职责委托给中介者对象。
  • 更容易理解和维护系统中的交互。

缺点:

  • 中介者可能会变得过于复杂,自身成为一个难以维护的大类。
  • 有可能过度使用,使得一些本可以直接通信的类也通过中介者来通信,可能引入不必要的复杂性。

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);}
}// 同事类
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);}
}public class Main {public static void main(String[] args) {ChatMediator mediator = new ChatRoom();User user1 = new ConcreteUser(mediator, "John");User user2 = new ConcreteUser(mediator, "Doe");mediator.addUser(user1);mediator.addUser(user2);user1.send("Hi there!");user2.send("Hello!");}
}

         在这个示例中,ChatRoom 充当中介者,User 和其子类 ConcreteUser 充当同事类。通过中介者,同事类之间能够交换消息,而无需直接互相引用。

        非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~

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

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

相关文章

socket通信基础讲解及示例-C

socket通信之C篇 服务端与客户端简介 socket通信服务端与客户端通信模型通信实战server&#xff08;服务端&#xff09;创建client&#xff08;客户端&#xff09;创建 函数详解创建套接字 socket绑定端口bind进入监听状态listen获取客户端连接请求accept接收网络数据read发送数…

selenium上传文件时打开指定本地文件路径

遇到这样一个问题&#xff1a; 用selenium和chromedriver操作浏览器&#xff0c;其中有一个“本地上传”的按钮&#xff0c;点击后&#xff0c;会进入本地电脑的文件夹&#xff0c;但是这个文件夹一般是C:\Users\XX。如何指定本地上传路径呢&#xff1f; 看起来很简单的一个问…

《前端面试题》- 编程题-手写new(JS)

function Person(name) {this.name name; }Person.prototype.say function() {console.log(Im ${this.name}); }const xiaoming new Person(xiaoming); xiaoming.say(); // 输出 // Im xiaomingfunction _new(fn, ...args) {// 基于fn的原型创建一个新的对象const emptyObj …

每日一题---移除链表元素

文章目录 前言1.题目2.分析思路3.参考代码 前言 Leetcode–-移除链表元素 1.题目 2.分析思路 首先要创建一个新的链表&#xff0c;在定义三个指针&#xff0c;newHead&#xff0c;newTail和pcur&#xff0c;分别代表新链表头&#xff0c;新链表尾以及用于遍历原链表。 其次是…

Rust入门-所有权

一、为什么、是什么、怎么用 1、为什么Rust要提出一个所有权和借用的概念 所有的程序都必须和计算机内存打交道&#xff0c;如何从内存中申请空间来存放程序的运行内容&#xff0c;如何在不需要的时候释放这些空间&#xff0c;成为所有编程语言设计的难点之一。 主要分为三种…

git merge 和 git rebese的区别

git merge 和 git rebese的区别 拉取分支和合并代码会涉及两种选择&#xff0c;git merge 和 git rebase&#xff1a; rebase&#xff1a;变基&#xff0c;会有一个干净的分支&#xff0c;但是对于记录来源不够清楚merge&#xff1a;合并&#xff0c;git 分支看起来比较混乱&…

CentOS 7虚拟机配置静态IP地址(一)

IP地址的配置 以下几个地址需要记住&#xff0c;在配置中使用 &#xff08;1&#xff09;查看MAC地址&#xff08;点击菜单虚拟机-设置-网络适配器-高级-记住MAC地址&#xff09; &#xff08;2&#xff09;查看子网掩码和网关IP&#xff08;点击菜单编辑-虚拟网络编辑器-选择…

机器学习-10-神经网络python实现-从零开始

文章目录 总结参考本门课程的目标机器学习定义从零构建神经网络手写数据集MNIST介绍代码读取数据集MNIST神经网络实现测试手写的图片 带有反向查询的神经网络实现 总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍基于python实现神经网络。 参考 BP神经网络及pytho…

智能家居如何融合人工智能技术

随着科技的飞速发展&#xff0c;智能家居已经成为了现代家庭的一个重要组成部分。而人工智能技术的应用&#xff0c;则使得智能家居更加智能化、便捷化和个性化。让我们一起来探讨智能家居如何融合人工智能技术&#xff0c;为我们的生活带来更多的便利和舒适。 1. 智能语音助手…

Reactor 模式

目录 1. 实现代码 2. Reactor 模式 3. 分析服务器的实现具体细节 3.1. Connection 结构 3.2. 服务器的成员属性 3.2. 服务器的构造 3.3. 事件轮询 3.4. 事件派发 3.5. 连接事件 3.6. 读事件 3.7. 写事件 3.8. 异常事件 4. 服务器上层的处理 5. Reactor 总结 1…

公钥密码学Public-Key Cryptography

公钥或非对称密码学的发展是整个密码学历史上最伟大的&#xff0c;也许是唯一真正的革命。The development of public-key, or asymmetric, cryptography is the greatest and perhaps the only true revolution in the entire history of cryptography. 公钥算法基于数学函数…

node.js如何实现留言板功能?

一、实现效果如下&#xff1a; 20240422_160404 二、前提配置&#xff1a; 配置&#xff1a;需要安装并且导入underscore模板引擎 安装&#xff1a;在控制台输入npm install underscore -save 文件目录配置&#xff1a; 1》在文件里建一个data文件夹&#xff0c;此文件夹下…

ContextMenuStrip内容菜单源对象赋值学习笔记(含源码)

一、前言 MetroTileItem属于第三方控件,无法定义ContextMenuStrip属性 想实现某子项点击菜单时,与源控件(按钮metroTileItem)的某值对应,用于动态控制按钮的状态或方法 1.1 效果 二、实现方法 2.1 方法1 (代码,说明见注释) private void metroTileItem_MouseDown(o…

【排序算法】快速排序

快速排序&#xff08;Quick Sort&#xff09;是一种常用的排序算法&#xff0c;它采用分而治之的策略来对一个序列进行排序。快速排序的基本思想是选择一个基准元素&#xff08;通常是序列中的第一个元素&#xff09;&#xff0c;然后将序列中的其他元素分为两个子序列&#xf…

微信小程序 如何在组件中实现 上拉加载下一页和下拉触底

通过在父页面中使用selectComponent来调用子组件的方法来实现 1、在component中配置好方法 子页面homePage/index/index.js // homePage/index/index.js var total 0 var pageNo 1 const pageSize 20 Component({/*** 组件的属性列表*/properties: {},lifetimes: {create…

【题解】AB5 点击消除(栈)

https://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5?tpId308&tqId40462&ru/exam/oj 把string当栈用&#xff0c;扫一遍就可以了&#xff0c;时间复杂度O(n) #include <iostream> #include <string> using namespace std;int main() {…

深度学习基础之《TensorFlow框架(13)—二进制数据》

一、CIFAR10二进制数据集介绍 1、CIFAR-10数据集 CIFAR-10数据集由10个类别的60000个32x32彩色图像组成&#xff0c;每个类别有6000个图像。有50000个训练图像和10000个测试图像 2、数据集分为五个训练批次和一个测试批次&#xff0c;每个批次有10000个图像 3、data_batch_1…

向量的点积和叉积的几何意义

1. 点积 点积(dot product)&#xff0c;又称标量积&#xff08;scalar product&#xff09;。结果等于。 可用于 判断的是否垂直求投影长度求向量是抑制作用还是促进作用 2. 叉积 叉积(cross product)&#xff0c;又称为向量积(vector product)。模长等于&#xff0c;方向…

Golang | Leetcode Golang题解之第43题字符串相乘

题目&#xff1a; 题解&#xff1a; func multiply(num1 string, num2 string) string {if num1 "0" || num2 "0" {return "0"}m, n : len(num1), len(num2)ansArr : make([]int, m n)for i : m - 1; i > 0; i-- {x : int(num1[i]) - 0fo…

详细说说,中介怎么做!CLHLS数据库探索抑郁症状的中介作用发文二区

零基础CHARLS发论文&#xff0c;不容错过&#xff01; 长期回放更新指导&#xff01;适合零基础&#xff0c;毕业论文&#xff0c;赠送2011-2020年CHARLS清洗后的数据全套代码&#xff01; 2024年3月28日&#xff0c;中国学者用CLHLS数据库最新数据&#xff08;2018年&#xff…