设计模式(4)--对象行为(5)--中介者

1. 意图

    用一个中介对象来封装一系列的对象交互。

    中介者使各对象不需要显式地相互引用,从而使其耦合松散,

    而且可以独立地改变它们之间的交互。

2. 四种角色

    抽象中介者(Mediator)、具体中介者(Concrete Mediator)、抽象同事(Colleague)、

    具体同事(Concrete Colleague)

3. 优点

    3.1 减少了子类生成。

    3.2 将各个Colleague解耦。

    3.3 简化了对象协议。

    3.4 对对象如何协作进行了抽象。

4. 缺点

    4.1 使控制集中化,可能使中介者自身称为一个难于维护的庞然大物

5. 相关模式

    5.1 Mediator的协议是多向的,提供了Colleague对象间的协作行为;
          而Façade的协议是单向的,只能Façade对子系统提出请求。

    5.2 Colleague可使用Observer模式与Mediator通信。

6. 代码示意(C++)
#pragma once
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Colleague;

class Mediator
{
public:
	virtual void SendMessage(const string& message, Colleague* pFrom) = 0;
	virtual void AddColleague(Colleague* pColleague) = 0;
};

class ConcreteMediator :public Mediator
{
	vector<Colleague*> m_colleagues;
public:
	virtual void SendMessage(const string& message, Colleague* pFrom);
	virtual void AddColleague(Colleague* pColleague);
};

class Colleague
{
	string m_strName;
	Mediator* m_pMediator;
public:
	Colleague(Mediator* pMediator, const string& strName) {
		m_pMediator = pMediator;
		m_strName = strName;
	}
	void SendMessage(const string& message) {
		m_pMediator->SendMessage(message, this);
	}
	string GetName() { return m_strName; }

	virtual void GetMessage(const string& message, const string& name) = 0;
};

class ConcreteColleage1 :public Colleague
{
public:
	ConcreteColleage1(Mediator* pMediator) :Colleague(pMediator, "ConcreteColleage1") {

	}
	virtual void GetMessage(const string& message, const string& name) {
		cout << "ConcreteColleage1 got message:" << message << ",from:" << name << endl;
	}
};

class ConcreteColleage2 :public Colleague
{
public:
	ConcreteColleage2(Mediator* pMediator) :Colleague(pMediator, "ConcreteColleage2") {

	}
	virtual void GetMessage(const string& message, const string& name) {
		cout << "ConcreteColleage2 got message:" << message << ",from:" << name << endl;
	}
};

 Mediator.cpp:

#include "Mediator.h"

void ConcreteMediator::SendMessage(const string& message, Colleague* pFrom) {
	auto it = m_colleagues.begin();
	while (it != m_colleagues.end()) {
		if (pFrom != (*it)) {
			(*it)->GetMessage(message, pFrom->GetName());
		}
		++it;
	}
}
void ConcreteMediator::AddColleague(Colleague* pColleague) {
	m_colleagues.emplace_back(pColleague);
}
#include "Mediator.h"
int main() {
	Mediator* pMediator = new ConcreteMediator();

	Colleague* pColleague1 = new ConcreteColleage1(pMediator);
	Colleague* pColleague2 = new ConcreteColleage2(pMediator);
	pMediator->AddColleague(pColleague1);
	pMediator->AddColleague(pColleague2);

	pColleague1->SendMessage("hello");

	pColleague2->SendMessage("hi");

	delete pColleague1;
	delete pColleague2;
	delete pMediator;
	return 0;
}

运行结果:

 6.1 ConcreteColleage之间不直接打交道,消息通过ConcreteMediator传递(3.2)。

 6.2 将多对多的关系变成了一对多(一个中介对多个同事)的关系(3.3)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

https密钥认证、上传镜像实验

一、第一台主机通过https密钥对认证 1、安装docker服务 &#xff08;1&#xff09;安装环境依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 &#xff08;2&#xff09;设置阿里云镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/do…

时序预测 | Matlab实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测

时序预测 | Matlab实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短…

中伟视界:燃气站的烟火、安全帽、抽烟、打电话检测等AI算法的工作原理详解

人工智能&#xff08;AI&#xff09;技术在各行各业中的应用越来越广泛&#xff0c;燃气站的安全管理也在逐步引入AI算法。本文将详细介绍AI算法在燃气站安全管理中的应用&#xff0c;包括烟火检测、安全帽识别、抽烟、打电话检测等方面的工作原理。 烟火检测是燃气站安全管理中…

Java之网络编程

一、什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;可以进行数据传输 二、常见的网络架构 1、B/S &#xff1a;Browser/Server 只需要一个浏览器&#xff0c;用户通过不同的网址&#xff0c;客户访问不同的服务器。 例如&#xff1a;京东&am…

redis,memcached,nginx网络组件,网络编程——reactor的应用

目录 目标网络编程关注的问题连接的建立连接的断开消息的到达消息发送完毕 网络 IO 职责检测 IO检测 io剖析 操作 IO 阻塞IO 和 非阻塞IOIO 多路复用epoll结构以及接口 reactor编程连接建立连接断开数据到达数据发送完毕 reactor 应用&#xff1a;后续补充源码解析单 reacrtor多…

JVM高频面试题(2023最新版)

JVM面试题 1、JVM内存区域 Jvm包含两个子系统和两个组件。 1.1子系统 Class loader&#xff08;类加载器&#xff09;&#xff1a;根据给定的全限定名类名&#xff08;java.lang.object&#xff09;来装载class文件到Runtime data area&#xff08;运行时数据区&#xff09;…

flask文件夹列表改进版--Bug追踪

把当前文件夹下的所有文件夹和文件列出来&#xff0c;允许点击返回上层目录&#xff0c;允许点击文件夹进入下级目录并显示此文件夹内容 允许点击文件进行下载 from flask import Flask, render_template, send_file, request, redirect, url_for import osapp Flask(__name_…

阿里云自建官方Docker仓库镜像提交拉取方法

文章目录 发布镜像到DockerHub发布镜像到自建Docker仓库(Harbor)修改配置文件在Linux服务器中登录Docker打TAGPUSH提交镜像PULL拉取镜像 发布镜像到阿里云容器服务在Linux服务器中登录DockerPUSH提交镜像PULL拉取镜像 发布镜像到DockerHub 本地我们镜像命名可能会不规范&#…

SpringCloud 整合 Canal+RabbitMQ+Redis 实现数据监听

1Canal介绍 Canal 指的是阿里巴巴开源的数据同步工具&#xff0c;用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.…

【面试】Java中的多种设计模式(十种主要设计模式)

Java中的多种设计模式&#xff08;十种主要设计模式&#xff09; 文章概述 设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。它是软件工程中常见问题的解决方案的一种描述或模板。设计模式可以提供一种通用的、可重用的解决方案&#xff0c;帮助开发…

16.Redis 高级数据类型 + 网站数据统计

目录 1.Redis 高级数据类型 2.网站数据统计 2.1 业务层 2.2 表现层 2.2.1 记录数据 2.2.2 查看数据 1.Redis 高级数据类型 HyperLogLog&#xff1a;采用一种基数算法&#xff0c;用于完成独立总数的统计&#xff1b;占据空间小&#xff0c;无论统计多少个数据&#xff0…

PYTHON基础:最小二乘法

最小二乘法的拟合 最小二乘法是一种常用的统计学方法&#xff0c;用于通过在数据点中找到一条直线或曲线&#xff0c;使得这条直线或曲线与所有数据点的距离平方和最小化。在线性回归中&#xff0c;最小二乘法被广泛应用于拟合一条直线与数据点之间的关系。 对于线性回归&…

华为——使用ACL限制内网主机访问外网网站示例

组网图形 图1 使用ACL限制内网主机访问外网网站示例 ACL简介配置注意事项组网需求配置思路操作步骤配置文件 ACL简介 访问控制列表ACL&#xff08;Access Control List&#xff09;是由一条或多条规则组成的集合。所谓规则&#xff0c;是指描述报文匹配条件的判断语句&#…

RFID技术在汽车制造:提高生产效率、优化物流管理和增强安全性

RFID技术在汽车制造:提高生产效率、优化物流管理和增强安全性 随着科技的进步&#xff0c;物联网技术已经深入到各个领域&#xff0c;尤其在制造业中&#xff0c;RFID技术以其独特的优势&#xff0c;如高精度追踪、实时数据收集和自动化操作&#xff0c;正在改变传统的生产方式…

FonePaw iOS Transfer for Mac: 让您的IOS设备数据无忧传输

在数字世界里&#xff0c;随着我们的生活与科技越来越紧密&#xff0c;数据传输成为了我们日常生活中的重要部分。尤其对于广大的苹果用户来说&#xff0c;如何方便、快速地传输数据成为了他们关注的焦点。今天&#xff0c;我要为大家介绍一款专门为Mac用户设计的IOS数据传输工…

云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd) 5.master2节点迁移容器运行时(docker → containerd) 6.node1节点容器运行时迁移(docker → containerd) 7.升级集群计划&#xff08;v1.23.14 → v1.24.1&#…

macos Apple开发证书 应用签名p12证书 获取生成方法 codesign 证书获取

在开发macos应用的时候必须要对自己开发的应用进行签名才能使用, 下面介绍个人如何获取Apple开发签名证书. 必备条件, 你需要先安装 xcode , 注册一个苹果开发者账号 免费的就可以, 以下为获取流程 You need to create a cert through xcode. Additionally, you need to have…

Jmeter之从CSV文件获取数据

新建csv文件 新建一个excel&#xff0c;填充业务数据&#xff0c;然后导出csv格式文件。 添加一个CSV数据文件 使用

苏州科技大学计算机817程序设计(java) 学习笔记

之前备考苏州科技大学计算机&#xff08;专业课&#xff1a;817程序设计&#xff08;java&#xff09;&#xff09;。 学习Java和算法相关内容&#xff0c;现将笔记及资料统一整理归纳移至这里。 部分内容不太完善&#xff0c;欢迎提议。 目录 考情分析 考卷题型 刷题攻略…

Linux中Mysql数据库备份操作

逻辑备份 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中小型数据库&#xff0c;效率相对较低。 本质&#xff1a;导出的是SQL语句文件 优点&#xff1a;不论是什么存储引擎&#xff0c;都可以用mysqldump备成SQL语句 缺点&#xff1a;速度较慢&#xff0c;…
最新文章