行为型模式之中介者模式

中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式,旨在通过封装一系列对象之间的交互方式,使其能够独立地进行通信。
中介者模式的核心思想是将对象之间的直接通信改为通过一个中介者对象来进行间接通信,从而减少对象之间的耦合度。
在中介者模式中,中介者(Mediator)对象充当了协调者的角色,它负责控制和管理多个 colleague 对象之间的通信过程。
colleague 对象则相互依赖于中介者对象,通过中介者来实现彼此之间的通信,而不是直接交互。

以下是中介者模式的基本组成部分:
Mediator(中介者):定义中介者接口,通常包含用于协调 colleague 对象之间通信的方法。
ConcreteMediator(具体中介者):实现中介者接口,具体实现协调 colleague 对象之间通信的逻辑。
Colleague(同事):定义同事对象的接口,通常包含了被中介者调用的方法。
ConcreteColleague(具体同事):实现同事接口,与其他同事对象进行通信,并在需要时与中介者对象进行交互。
中介者模式的优点包括:
减少了对象间的直接耦合,增加了可维护性和灵活性。
通过集中管理对象间的通信,简化了系统的设计和实现。
可以更方便地扩展和修改系统,增加新的 colleague 对象或修改中介者逻辑。

然而,中介者模式也存在一些缺点:
中介者对象可能会变得复杂,并承担过多的责任。
中介者模式在一定程度上违背了单一职责原则,因为它需要处理大量 colleague 对象之间的通信逻辑。
中介者模式适用于同事之间存在复杂的关联关系,且彼此之间的通信行为难以直接管理和维护的情况。
它可以帮助我们在系统中构建松耦合的对象间交互机制,提高系统的可拓展性和可维护性。

提供demo版代码更容易理解

/*** @author zhou*  中介者接口*/
interface Mediator {void sendMessage(String message, Colleague colleague);
}/*** @author zhou*  具体中介者类*/
class ConcreteMediator implements Mediator {private Colleague colleague1;private Colleague colleague2;public void setColleague1(Colleague colleague1) {this.colleague1 = colleague1;}public void setColleague2(Colleague colleague2) {this.colleague2 = colleague2;}@Overridepublic void sendMessage(String message, Colleague colleague) {if (colleague == colleague1) {colleague2.receiveMessage(message);} else if (colleague == colleague2) {colleague1.receiveMessage(message);}}
}/*** @author zhou*  抽象同事类*/
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void sendMessage(String message);public abstract void receiveMessage(String message);
}/*** @author zhou*  具体同时类1*/
class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message) {System.out.println("ConcreteColleague1 received message: " + message);}
}/*** @author zhou*  具体同时类2*/
class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message) {System.out.println("ConcreteColleague2 received message: " + message);}
}/*** @author zhou*  客户端实现*/
public class MediatorPatternDemo {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);mediator.setColleague1(colleague1);mediator.setColleague2(colleague2);colleague1.sendMessage("Hello, colleague2!");colleague2.sendMessage("Hi, colleague1!");}
}

中介者(Mediator)接口定义了消息的发送方法sendMessage,具体中介者类(ConcreteMediator)实现了该接口,
并通过引入两个具体同事类(ConcreteColleague1和ConcreteColleague2)来协调他们之间的信息交互。
每个具体同事类都持有中介者对象,并实现了消息的发送(sendMessage)和接收(receiveMessage)方法。

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

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

相关文章

套接字通信的客户端和服务端的实现

知识了解: 1.IP:本质是一个整型数,用于表示计算机在网络中的地址。IP协议版本有两个:IPv4和IPv6 IPv4(Internet Protocol version4): 使用一个32位的整型数描述一个IP地址,4个字节,int型也可以…

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…

[运维]python 启用http 文件服务

要在Python中启用HTTP文件服务,您可以使用内置的http.server模块(在Python 3中)或SimpleHTTPServer模块(在Python 2中)。 在Python 3中: python -m http.server在Python 2中: python -m Simp…

力扣SQL之路:窗口函数应用

文章目录 1.引言2.力扣SQL题目3. 解题策略4.代码实现5.总结 1.引言 窗口函数是 SQL 中一种强大的分析函数,它可以在结果集中创建一个窗口,并对窗口内的数据进行计算和分析。在力扣(LeetCode)的 SQL 题目中,窗口函数经…

Linux进程概念(一)

文章目录 Linux进程概念查看进程杀死进程进程标识符 手动创建进程的方式fork函数创建进程 进程状态运行态阻塞态和挂起 Linux进程概念 前文我们了解了,进程的基本概念,在课本上被描述为,正在执行的程序,在linux内核上&#xff0c…

代码随想录算法训练营day50

文章目录 Day50买卖股票的最佳时机III题目思路代码 买卖股票的最佳时机IV题目思路代码 Day50 买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣(LeetCode) 题目 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。…

P5724 【深基4.习5】求极差 / 最大跨度值

题目描述 给出 n n n 和 n n n 个整数 a i a_i ai​,求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。 输入格式 第一行输入一个正整数 n n n,表示整数个数。 第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,…

如何在Linux系统中使用yum命令安装MySQL

1、安装软件 # yum install -y https://repo.mysql.com//mysql80-community-release-el7-8.noarch.rpm # yum -y install mysql-community-server网址来源:https://dev.mysql.com/downloads/repo/yum/ 2、启动软件 # systemctl enable mysqld# systemctl start my…

如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1

作者:双飞(花名:小鱼) 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好,我是 StoneDB 的实习生小鱼,目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久&#xff0c…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快,企业使用前沿技术加快商业创新,以提高竞争力。其中如何加快开发效率,为客户创造更多价值成为新的关注焦点。 继DevOps后,“平台工程”(Platform Engineering) 一词引发热议。平台工…

MyBatis的使用方法

文章目录 一、MyBatis的创建准备工作 二、MyBatis的使用1.项目分层2.业务代码1&#xff09;使用XML的方法2&#xff09;直接使用注解 总结 一、MyBatis的创建 准备工作 1.添加依赖 旧项目 方法一&#xff1a;在pom.xml中添加MyBatis和MySQL Diver依赖 <!-- 添加 MyBati…

基于飞桨paddle波士顿房价预测练习模型测试代码

基于飞桨paddle波士顿房价预测练习模型测试代码 导入基础库 #paddle&#xff1a;飞桨的主库&#xff0c;paddle 根目录下保留了常用API的别名&#xff0c;当前包括&#xff1a;paddle.tensor、paddle.framework、paddle.device目录下的所有API&#xff1b; import paddle #Lin…

基于STM32的儿童误锁车内远程报警系统(华为云IOT)

一、项目背景 汽车发展历史汽车自上个世纪末诞生以来,已经走过了风风雨雨的一百多年。汽车经过百年历史的演变,已经在世界各地获得广泛的普及和应用,但是事物总会具有两面性,汽车方便了人们生活的同时也带来了不安全的因素。 儿童的出行和乘车安全始终都是我国现代汽车安…

Sentinel持久化规则

项目中有用到Sentinel,然后需要将Sentinel上配置的规则做持久化(或者初始化),通过改写Sentinel源码实现了需求,下面记录一下实现过程。 如果不知道Sentinel怎么搭,可以看看: 流控平台Sentinel搭建和接入教程_东皋长歌的博客-CSDN博客 一,背景 Sentinel是Alibaba开源…

信息技术会考操作题excel,信息技术会考操作题目

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;信息技术会考操作题python计算题&#xff0c;信息技术会考操作题没有保存&#xff0c;今天让我们一起来看看吧&#xff01; 1. 数据分析题&#xff08;17分&#xff09;&#xff1a; 流行病学通常关注单日治愈患者例数增…

@vue/composition-api功能介绍

前言 vue/composition-api 是通过一个插件的方式,为 Vue2&#xff08;2.7自带&#xff0c;2.6及以下可用&#xff09; 提供类似 Vue3 composition API 的函数式编程能力。它的实现思路主要有: 1、提供组合式函数,在函数内部追踪响应性依赖。 2、将组合产生的响应式状态保存到…

网络知识介绍

一、TCP 传输控制协议&#xff0c;Transmission Control Protocol。 面向广域网的通信协议&#xff0c;跨域多个网络通信时&#xff0c;为两个通信端点之间提供一条具有如下特点的通信方式&#xff1a; 基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带…

初识Linux

今天简单了解了关于操作系统的发展史&#xff0c;学习了在Linux中如何远程连接云服务器的指令&#xff0c;以及在Linux中创建多个用户的指令。 1. ssh root 服务器远程地址 作用是用来连接XShell与云服务器&#xff0c;输入该指令后会自动生成输入密码的窗口&#xff0c;如…

【产品经理】高阶产品如何处理需求?(3方法论+2案例+1清单)

不管你是萌新小白&#xff0c;还是工作了几年的“老油条”&#xff0c;需求一直是产品经理工作的重点。只不过&#xff0c;不同年限的产品经理需要面对的需求大有不同&#xff0c;对能力的要求更高。 不知你是否遇过以下问题&#xff1f; 你接手一个项目后&#xff0c;不知从何…

DID以及社交网络中的ZKP

1. 引言 本文关键术语为&#xff1a; Decentralized Identity (DID&#xff0c;去中心化身份) or self-sovereign identity (SSI&#xff0c;自治身份) &#xff1a;是一个基于开放标准的框架&#xff0c;使用自主、独立的标识符和可验证证书&#xff0c;实现可信的数据交换。…