19 C++设计模式之中介者(Mediator)模式
文章目录
- 中介者(Mediator)模式定义
- 中介者(Mediator)模式优缺点
- 优点
- 缺点
- 中介者(Mediator)模式构成与实现
- 构成
- 实例
中介者(Mediator)模式定义
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
中介者(Mediator)模式优缺点
优点
- 单一职责原则。你可以将多个组件间的交流抽取到同一位置,使其更易于理解和维护。
- 开闭原则。你无需修改实际组件就能增加新的中介者。
- 你可以减轻应用中多个组件间的耦合情况。
- 你可以更方便地复用各个组件。
缺点
- 一段时间后,中介者可能会演化成为上帝对象
中介者(Mediator)模式构成与实现
构成
- 组件(Component)是各种包含业务逻辑的类。每个组件都有一个指向中介者的引用,该引用被声明为中介者接口类型。组件不知道中介者实际所属的类,因此你可通过将其连接到不同的中介者以使其能在其他程序中复用。
- 中介者(Mediator)接口声明了与组件交流的方法, 但通常仅包括一个通知方法。组件可将任意上下文(包括自己的对象)作为该方法的参数,只有这样接收组件和发送者类之间才不会耦合。
- 具体中介者(Concrete Mediator)封装了多种组件间的关系。具体中介者通常会保存所有组件的引用并对其进行管理,甚至有时会对其生命周期进行管理。
- 组件并不知道其他组件的情况。如果组件内发生了重要事件,它只能通知中介者。中介者收到通知后能轻易地确定发送者,这或许已足以判断接下来需要触发的组件了。对于组件来说,中介者看上去完全就是一个黑箱。发送者不知道最终会由谁来处理自己的请求,接收者也不知道最初是谁发出了请求。
实例
Mediator.h:
#ifndef MEDIATOR_H_
#define MEDIATOR_H_#include <string>class Colleague;// 抽象中介者
class Mediator {public:// 声明抽象方法virtual void registerMethod(Colleague*) = 0;// 声明抽象方法virtual void operation(Colleague*) = 0;
};#endif // MEDIATOR_H_
Component.h:
#ifndef COMPONENT_H_
#define COMPONENT_H_#include "Mediator.h"
#include <cstdio>
#include <string>enum PERSON_TYPE {kUnknown,kLandlord,kTenant,
};// 组件基类
class Colleague {public:void set_mediator(Mediator *m) {mediator_ = m;}Mediator* get_mediator() {return mediator_;}void set_personType(PERSON_TYPE pt) {person_type_ = pt;}PERSON_TYPE get_person_type() {return person_type_;}virtual void ask() = 0;virtual void answer() = 0;private:Mediator* mediator_;PERSON_TYPE person_type_;
};// 具体组件1: 房东
class Landlord : public Colleague {public:Landlord() {name_ = "unknown";price_ = -1;address_ = "unknown";phone_number_ = "unknown";set_personType(kUnknown);}Landlord(std::string name, int price, std::string address, std::string phone_number) {name_ = name;price_ = price;address_ = address;phone_number_ = phone_number;set_personType(kLandlord);}void answer() override {printf("房东姓名:%s 房租:%d 地址:%s 电话:%s\n", name_.c_str(), price_, address_.c_str(), phone_number_.c_str());}void ask() override {printf("房东%s查看租客信息: \n", name_.c_str());this->get_mediator()->operation(this);}private:std::string name_;int price_;std::string address_;std::string phone_number_;
};// 具体组件2: 租客
class Tenant : public Colleague {public:Tenant() {name_ = "unknown";}explicit Tenant(std::string name) {name_ = name;set_personType(kTenant);}void ask() {printf("租客%s询问房东信息:\n", name_.c_str());this->get_mediator()->operation(this);}void answer() {printf("租客姓名: %s\n", name_.c_str());}private:std::string name_;
};#endif // COMPONENT_H_
ConcreteMediator.h:
#ifndef CONCRETE_MEDIATOR_H_
#define CONCRETE_MEDIATOR_H_#include <vector>
#include <string>
#include "Component.h"
#include "Mediator.h"// 具体中介类: 房产中介
class Agency : public Mediator {public:void registerMethod(Colleague* person) override {switch (person->get_person_type()) {case kLandlord:landlord_list_.push_back(reinterpret_cast<Landlord*>(person));break;case kTenant:tenant_list_.push_back(reinterpret_cast<Tenant*>(person));break;default:printf("wrong person\n");}}void operation(Colleague* person) {switch (person->get_person_type()) {case kLandlord:for (int i = 0; i < tenant_list_.size(); i++) {tenant_list_[i]->answer();}break;case kTenant:for (int i = 0; i < landlord_list_.size(); i++) {landlord_list_[i]->answer();}break;default:break;}}private:std::vector<Landlord*> landlord_list_;std::vector<Tenant*> tenant_list_;
};#endif // CONCRETE_MEDIATOR_H_
main.cpp
#include <iostream>
#include "ConcreteMediator.h"
#include "Component.h"int main() {system("chcp 65001");// 房产中介Agency *mediator = new Agency();// 三位房东Landlord *l1 = new Landlord("张三", 1820, "天津", "1333");Landlord *l2 = new Landlord("李四", 2311, "北京", "1555");Landlord *l3 = new Landlord("王五", 3422, "河北", "1777");l1->set_mediator(mediator);l2->set_mediator(mediator);l3->set_mediator(mediator);mediator->registerMethod(l1);mediator->registerMethod(l2);mediator->registerMethod(l3);// 两位租客Tenant *t1 = new Tenant("Zhang");Tenant *t2 = new Tenant("Yang");t1->set_mediator(mediator);t2->set_mediator(mediator);mediator->registerMethod(t1);mediator->registerMethod(t2);// 业务逻辑t1->ask();std::cout << std::endl;l1->ask();system("pause");delete mediator;delete l1;delete l2;delete l3;delete t1;delete t2;
}
输出:
Active code page: 65001
租客Zhang询问房东信息:
房东姓名:张三 房租:1820 地址:天津 电话:1333
房东姓名:李四 房租:2311 地址:北京 电话:1555
房东姓名:王五 房租:3422 地址:河北 电话:1777房东张三查看租客信息:
租客姓名: Zhang
租客姓名: Yang
Press any key to continue . . .
19 C++设计模式之中介者(Mediator)模式相关推荐
- 设计模式学习笔记——中介者(Mediator)模式
设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...
- 中介者(Mediator)模式
文章目录 中介者(Mediator)模式 1. 意图 2. 别名 3. 动机 4. 适用性 5. 结构 6. 参与者 7. 协作 8. 效果 9. 实现 10. 代码示例 11.已知应用 12. 相关 ...
- java mediator_Java 实现中介者(Mediator)模式
类图 public interface IMediator { public void createMediator(); public void work(); } /** * 中介.调节实际上需要 ...
- 设计模式--中介者(Mediator)模式
模式定义 用一个中介对象来封装(封装变化)一系列的对象交互,中介者使各对象不需要显示的相互引用,从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互 类图 应用场景 当多个对象互相关联交互并 ...
- 【笔记整理】图解设计模式 | 第16章 Mediator模式(只有一个仲裁者)
[笔记整理]图解设计模式 | 导航 定义 组员向仲裁者报告,仲裁者向组员下达指示. 当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. 当仲裁者下达指示时,组员会立即执行.团 ...
- C++之中介者(Mediator)模式
0. 简介 中介者模式和命令模式类似,都有着一层中间层来作为沟通的渠道,只是中介者模式使用了Mediator来实现实现更新函数changed.而在命令模式中使用Invoke作为最上层,用于管理具体类的 ...
- Facade与Mediator模式的区别
http://www.cnblogs.com/sweetdream/archive/2005/12/19/299983.html 门面(Facade)模式和中介者(Mediator)模式有着共同的目的 ...
- 设计模式之中介者模式(Mediator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...
最新文章
- AutoLisp:AutoLisp实现对AutoCAD进行输入命令,选择对象,实现不同方向进行缩放
- android one x3怎么样,618旗舰手机怎么选,看完这篇文章,你就会知道
- 「澳洋主数据项目」主数据促企业变革
- java get key_java如何获取String里面的键值对:key=valuekey=value
- python2和3语法区别_python2和3语法区别
- 如何卸载自己手机上的APK文件程序
- apollo配置中心搭建
- vite+vue3 整合vue-router4和vuex4
- 嵌入式ARM(Allwinner H3)下使用rtl8188eus无线网卡
- python大众点评霸王餐_大众点评-每天自动抽取霸王餐
- 计算机关机重启后黑屏,电脑重启黑屏强制关机后才能开怎么办
- 前端项目中如何去除已经不再使用的图片资源
- flowable中BPM实现核心对象
- 美团酒旅数据治理实践案例分享
- 使用OpenCV透视变换技术实现坐标变换实践
- 复盘在项目管理中的应用
- 元宇宙技术教程|如何一键生成虚拟人视频
- 【小程序】小程序组件-1
- SpringCloud学习笔记01
- HTTPS SSL证书
热门文章
- python之父名言_人生苦短 Python 格言
- 【自动驾驶】基于采样的路径规划算法——PRM(含python实现)
- worm/spybot_周末娱乐:在Spybot中搜索和销毁复活节彩蛋
- 设计模式练习(19)——策略模式
- C/C++ | sizeof()函数
- 基于C++模拟火车票售票系统【100010193】
- ​【预测模型】基于粒子群算法优化核极限学习机实现数据预测matlab代码
- php判断蜘蛛显示js,js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
- php排序数组排序_php简单实现多维数组排序的方法
- rapidjson创建json字符串