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

        中介者模式是一种行为型设计模式,用于减少对象之间的直接通信,而是通过一个中介对象来进行间接通信。这种模式有助于减少对象之间的耦合,使得系统更易于维护和扩展。
在中介者模式中,主要有以下几个角色:
① 中介者(Mediator):定义了一个接口用于各个同事对象之间的通信,并负责实现具体的协调逻辑。
② 具体中介者(ConcreteMediator):实现了中介者接口,负责协调各个同事对象之间的通信。
③ 同事类(Colleague):每个同事类都知道中介者对象,并通过中介者对象来通信,而不是直接与其他同事对象通信。
④ 具体同事类(ConcreteColleague):实现了同事类接口,每个具体同事类都需要知道中介者对象,并通过中介者对象来进行通信。
中介者模式通常应用于多个对象之间存在复杂的交互关系,通过引入中介者对象来简化对象之间的通信,降低耦合度,同时也使得系统更易于理解和扩展。

1、场景设计

实现场景:A、B两个同事通过中介者进行消息收发。

2、C++实现

`Colleague` 是同事类接口,定义了同事对象的基本行为。`ConcreteColleagueA` 和 `ConcreteColleagueB` 是具体的同事类,实现了同事类接口。`Mediator` 是中介者类接口,定义了中介者对象的基本行为。`ConcreteMediator` 是具体的中介者类,负责协调不同同事类之间的通信。在 `main` 函数中,我们创建了中介者对象和两个具体同事对象,并设置了中介者对象的引用,然后通过同事对象发送消息,中介者对象负责转发消息给其他同事对象。 

#include <iostream>
#include <string>
#include <vector>// 前置声明
class Mediator;// 同事类接口
class Colleague {protected:Mediator* mediator;public:Colleague(Mediator* mediator) : mediator(mediator) {}virtual void send(const std::string& message) = 0;virtual void receive(const std::string& message) = 0;
};// 中介者类接口
class Mediator {public:virtual void send(const std::string& message, Colleague* colleague) = 0;
};// 具体同事类A
class ConcreteColleagueA : public Colleague {public:ConcreteColleagueA(Mediator* mediator) : Colleague(mediator) {}void send(const std::string& message) override {mediator->send(message, this);}void receive(const std::string& message) override {std::cout << "ConcreteColleagueA received: " << message << std::endl;}
};// 具体同事类B
class ConcreteColleagueB : public Colleague {public:ConcreteColleagueB(Mediator* mediator) : Colleague(mediator) {}void send(const std::string& message) override {mediator->send(message, this);}void receive(const std::string& message) override {std::cout << "ConcreteColleagueB received: " << message << std::endl;}
};// 具体中介者类
class ConcreteMediator : public Mediator {private:ConcreteColleagueA* colleagueA;ConcreteColleagueB* colleagueB;public:void setColleagueA(ConcreteColleagueA* colleagueA) {this->colleagueA = colleagueA;}void setColleagueB(ConcreteColleagueB* colleagueB) {this->colleagueB = colleagueB;}void send(const std::string& message, Colleague* colleague) override {if (colleague == colleagueA) {colleagueB->receive(message);} else if (colleague == colleagueB) {colleagueA->receive(message);}}
};int main() {ConcreteMediator mediator;ConcreteColleagueA colleagueA(&mediator);ConcreteColleagueB colleagueB(&mediator);mediator.setColleagueA(&colleagueA);mediator.setColleagueB(&colleagueB);colleagueA.send("Hello from colleague A");colleagueB.send("Hi from colleague B");return 0;
}

3、Java实现

`Mediator` 是中介者接口,定义了中介者对象的基本行为。`Colleague` 是同事类抽象类,定义了同事对象的基本行为。`ConcreteColleagueA` 和 `ConcreteColleagueB` 是具体的同事类,实现了同事类抽象类。`ConcreteMediator` 是具体的中介者类,负责协调不同同事类之间的通信。在 `main` 方法中,我们创建了中介者对象和两个具体同事对象,并将同事对象添加到中介者对象中,然后通过同事对象发送消息,中介者对象负责转发消息给其他同事对象。 

package behavioralpattern.mediator;import java.util.ArrayList;
import java.util.List;// 中介者接口
interface Mediator {void sendMessage(String message, Colleague colleague);
}// 同事类抽象类
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);
}// 具体同事类A
class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message) {System.out.println("ConcreteColleagueA received: " + message);}
}// 具体同事类B
class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message) {System.out.println("ConcreteColleagueB received: " + message);}
}// 具体中介者类
class ConcreteMediator implements Mediator {private List<Colleague> colleagues = new ArrayList<>();public void addColleague(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void sendMessage(String message, Colleague colleague) {for (Colleague c : colleagues) {if (c != colleague) {c.receiveMessage(message);}}}
}public class MediatorDemo {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);mediator.addColleague(colleagueA);mediator.addColleague(colleagueB);colleagueA.sendMessage("Hello from colleague A");colleagueB.sendMessage("Hi from colleague B");}
}

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

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

相关文章

内网隧道技术总结

隧道技术解决的是网络通信问题&#xff0c;因为在内网环境下&#xff0c;我们不同的内网主机管理员会进行不同的网络配置&#xff0c;我们就需要使用不同的方式去控制我们的内网主机。隧道技术是一个后渗透的过程&#xff0c;是可以是我们已经取得了一定的权限&#xff0c;在这…

返回稀疏矩阵csr_matrix的对角线元素

diagonal matrix numpy python scipy Return diagonal elements of scipy sparse matrix https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix.html 给定scipy.sparse.csr.csr_matrix&#xff0c;有没有一种快速的方法可以返回对角线上的元素&…

MySQL运维故障解决方案:实战案例与深度解析

一、引言 MySQL数据库在企业应用中扮演着举足轻重的角色&#xff0c;但在运维过程中时常会遭遇各类故障。本文不仅梳理了常见的MySQL运维故障&#xff0c;还通过实战案例&#xff0c;展示了如何解决这些故障&#xff0c;确保数据库稳定运行。 二、常见故障及解决方案 1. 连接问…

NLP任务全览:涵盖各类NLP自然语言处理任务及其面临的挑战

自然语言处理(Natural Language Processing, 简称NLP&#xff09;是计算机科学与语言学中关注于计算机与人类语言间转换的领域。NLP将非结构化文本数据转换为有意义的见解&#xff0c;促进人与机器之间的无缝通信&#xff0c;使计算机能够理解、解释和生成人类语言。人类等主要…

(四)openlayers加入矢量图层.json文件

openlayers加入矢量图层.json文件 &#xff08;1&#xff09;接上一章节&#xff0c;添加矢量图层.json文件。首先下载.json矢量图层文件。链接&#xff1a;JSON矢量图层文件 &#xff08;2&#xff09;导入相关的依赖&#xff0c;提前把你下载好的矢量文件放入assets文件夹下…

巧用波卡生态优势,Mythical Games 引领 Web3 游戏新航向

Polkadot 对创新、安全和治理的承诺为 Mythical Games 提供了极大的发展价值。这个链上生态不仅将支持 Mythical Games 成长发展&#xff0c;还将帮助其他 Mythos 合作伙伴来壮大建设项目。 —— Mythical Games 创始人兼首席执行官 John Linden 近期 Web3 游戏行业又有新动向&…

【Linux】学习记录_12_system-V IPC 信号量

12 system-V IPC 信号量 12.1 进程信号量基本概念 信号量本质是计数器&#xff0c;用于协调多进程间对共享数据对象的读取&#xff0c;不以传送数据为目的&#xff0c; 主要用来保护共享资源(信号量也属于临界资源)&#xff0c;使该临界资源在一个时刻只有一个进程独享。 12…

microk8s拉取pause镜像卡住

前几天嫌服务器上镜像太多占空间&#xff0c;全部删掉了&#xff0c;今天看到 microk8s 更新了 1.30 版本&#xff0c;果断更新&#xff0c;结果集群跑不起来了。 先通过 microk8s.kubectl get pods --all-namespaces 命令看看 pod 状态。 如上图可以看到&#xff0c;所有的业…

JS -关于对象相关介绍

在JS中&#xff0c;除去基本的数据类型&#xff0c;还有包含对象这种复合数据类型&#xff0c;他可以储存多个键值对&#xff0c;并且每个键都是唯一的&#xff0c;并且在对象中可以包含各种数据类型的值&#xff0c;包括其他对象&#xff0c;数组&#xff0c;函数等。对象是Ja…

Spring Boot 中整合 Redisson 实现分布式锁

添加 Redisson 依赖&#xff1a;在 pom.xml 文件中添加 Redisson 的依赖。 配置 Redis 连接信息&#xff1a;在 application.properties 或 application.yml 文件中配置 Redis 的连接信息。 使用 Redisson 实现分布式锁&#xff1a;在预减库存的地方使用 Redisson 提供的分布…

LeetCode in Python 72. Edit Distance (编辑距离)

编辑距离的基本思想很直观&#xff0c;即不断比较两个单词每个位置的元素&#xff0c;若相同则比较下一个&#xff0c;若不同则需要考虑从插入、删除、替换三种方法中选择一个最优的策略。涉及最优策略笔者最先想到的即是动态规划的思想&#xff0c;将两个单词的位置对应放在矩…

C语言例题(递归、二分查找、冒泡排序)

一、递归案例 有5个人坐在在一起&#xff0c;问第5个人多少岁&#xff1f;他说比第4个人大两岁。问第4个人岁数&#xff0c;他说比第3个人大两岁。问第3个人&#xff0c;又说比第2个人大两岁。问第2个人&#xff0c;说比第1个人大2岁。最后问第1个人&#xff0c;他说是10岁。请…

Vue2 移动端(H5)项目封装弹窗组件

前言 因vant-ui的dialog组件没有自定义footer插槽 效果 参数配置 1、代码示例&#xff1a; <t-dialog :visible.sync"show" :title"title" submit"submit"></t-dialog>2、配置参数&#xff08;t-dialog Attributes&#xff09; 参…

IS62C256AL-45TLI功能参数介绍及如何优化性能

IS62C256AL-45TLI功能和参数介绍及如何优化性能-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 产品品种:静态随机存取存储器 RoHS:是 存储容量:256 kbit 组织:32 k x 8 访问时刻:45 ns 接口类型:Parallel 电源电压-最大:5.5 V 电源电压-最小:4.5 V 电源电流—最大值:25 mA 最小…

python内置函数help()详解

Python 内置函数 help() 1. 概述 help() 是 Python 中的一个内置函数&#xff0c;它提供了一个非常有用的帮助系统。通过这个函数&#xff0c;我们可以获取模块、类、方法、函数等对象的详细帮助信息。这些信息通常包括对象的文档字符串&#xff08;docstring&#xff09;、参…

JumpServer搭建堡垒机实战

文章目录 第一步、下载安装第二步、访问异常处理【1】docker方式拉取失败 JumpServer是运维人员可连接内部服务器上进行操作&#xff0c;支持Linux等操作系统的管理工具。 第一步、下载安装 curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/…

OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 需求说明 一般用到FFT&#xff0c;就涉及到复数的计算&#xff0c;为了便于调用&#xff0c;我自行封装了一个简单的复数矩阵点乘…

Flutter本地化存储介绍与使用

Flutter提供了多种本地化存储方案&#xff0c;可满足不同应用场景的需求。本文将介绍Flutter中常用的本地化存储方案&#xff0c;并演示如何使用它们存储和读取数据。 1. SharedPreferences SharedPreferences是Flutter中最常用的本地化存储方案之一&#xff0c;它用于存储键…

rror while loading shared libraries: libssl.so.10 亲测有效

wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-3.el8.x86_64.rpm rpm -ivh compat-openssl10-1.0.2o-3.el8.x86_64.rpm

如何用网页绘制一个黑莓9900的键盘效果图

如何用网页绘制一个黑莓9900的键盘效果图 入了几个黑莓蓝牙键盘&#xff0c;出于喜好&#xff0c;想做一个跟实体键盘一模一样的网页界面。 最终的实现效果是这样的&#xff1a; 在线查看&#xff1a;http://kylebing.cn/tools/bb-keyboard 点击上面四个按键显示不同模型界面…