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

devtools/2024/10/23 2:50:35/

        中介者模式是一种行为型设计模式,用于减少对象之间的直接通信,而是通过一个中介对象来进行间接通信。这种模式有助于减少对象之间的耦合,使得系统更易于维护和扩展。
中介者模式中,主要有以下几个角色:
① 中介者(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.ppmy.cn/devtools/5895.html

相关文章

设计模式学习(七)——《大话设计模式》

文章目录 设计模式学习&#xff08;七&#xff09;——《大话设计模式》工作原理工作流程示例 工作策略模式的应用场景策略模式的优点策略模式的缺点示例代码&#xff08;Python&#xff09; 策略模式UML类图具体应用和使用场景支付方式选择数据压缩工具表单验证路由算法日志记…

IaC:实现持续交付和 DevOps 自动化的关键

基础架构即代码&#xff08;IaC&#xff09;和 CI/CD 流水线最初似乎并不匹配。因为它们代表了两种不同的流程。IaC 主要关注基础设施的配置和开发&#xff0c;而 CI/CD 则围绕软件开发、测试和部署。 然而&#xff0c;将 IaC 集成到 CI/CD 流水线中具有多种优势。首先&#xf…

对组合模式的理解

目录 一、场景1、题目描述 【[案例来源](https://kamacoder.com/problempage.php?pid1090)】2、输入描述3、输出描述4、输入示例5、输出示例 二、实现&#xff08;假的组合模式&#xff09;1、代码2、为什么上面的写法是假的组合模式&#xff1f; 三、实现&#xff08;真的组合…

十分钟快速制作一个俄罗斯方块桌面游戏

准备 安装 Python: 下载 Python 安装程序: 访问 Python 官方网站,在下载页面选择适合您操作系统的 Python 版本。通常推荐下载最新版本。 运行安装程序: 下载完成后,运行下载的安装程序。在安装过程中,请确保勾选“Add Python X.X to PATH”选项(X.X 代表您下载的 Pyth…

模块与包及json模块学习

【一】模块与包介绍 【1】什么是模块 在Python中&#xff0c;一个py文件其实就是一个模块 文件名 knight.py中 py就是模块名 【2】模块的优点 有了模块以后可以增加程序的可读性&#xff0c;提高开发效率 【3】模块的来源 &#xff08;1&#xff09;在Python解释器内部内…

MySQL数据库企业级开发技术(下篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号&#xff0c;就代表可写可不写 目录 1. 视图 1.1 需要视图的原因 1.2 视图介绍 1.2.1 …

51.基于SpringBoot + Vue实现的前后端分离-校园志愿者管理系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的校园志愿者管理系统设计与实现管理工…

Java -jar参数详解:掌握Java可执行JAR文件的运行技巧

作为一种常用的开发语言&#xff0c;Java经常使用可执行的JAR&#xff08;Java Archive&#xff09;文件来打包和分发应用程序。使用java -jar命令运行JAR文件是一种方便快捷的方式。本文将详细介绍java -jar命令的各种参数&#xff0c;帮助您充分利用这个功能。 一、简介 java…