文章目录

  • 中介者(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)模式相关推荐

  1. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  2. 中介者(Mediator)模式

    文章目录 中介者(Mediator)模式 1. 意图 2. 别名 3. 动机 4. 适用性 5. 结构 6. 参与者 7. 协作 8. 效果 9. 实现 10. 代码示例 11.已知应用 12. 相关 ...

  3. java mediator_Java 实现中介者(Mediator)模式

    类图 public interface IMediator { public void createMediator(); public void work(); } /** * 中介.调节实际上需要 ...

  4. 设计模式--中介者(Mediator)模式

    模式定义 用一个中介对象来封装(封装变化)一系列的对象交互,中介者使各对象不需要显示的相互引用,从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互 类图 应用场景 当多个对象互相关联交互并 ...

  5. 【笔记整理】图解设计模式 | 第16章 Mediator模式(只有一个仲裁者)

    [笔记整理]图解设计模式 | 导航 定义 组员向仲裁者报告,仲裁者向组员下达指示. 当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. 当仲裁者下达指示时,组员会立即执行.团 ...

  6. C++之中介者(Mediator)模式

    0. 简介 中介者模式和命令模式类似,都有着一层中间层来作为沟通的渠道,只是中介者模式使用了Mediator来实现实现更新函数changed.而在命令模式中使用Invoke作为最上层,用于管理具体类的 ...

  7. Facade与Mediator模式的区别

    http://www.cnblogs.com/sweetdream/archive/2005/12/19/299983.html 门面(Facade)模式和中介者(Mediator)模式有着共同的目的 ...

  8. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

最新文章

  1. AutoLisp:AutoLisp实现对AutoCAD进行输入命令,选择对象,实现不同方向进行缩放
  2. android one x3怎么样,618旗舰手机怎么选,看完这篇文章,你就会知道
  3. 「澳洋主数据项目」主数据促企业变革
  4. java get key_java如何获取String里面的键值对:key=valuekey=value
  5. python2和3语法区别_python2和3语法区别
  6. 如何卸载自己手机上的APK文件程序
  7. apollo配置中心搭建
  8. vite+vue3 整合vue-router4和vuex4
  9. 嵌入式ARM(Allwinner H3)下使用rtl8188eus无线网卡
  10. python大众点评霸王餐_大众点评-每天自动抽取霸王餐
  11. 计算机关机重启后黑屏,电脑重启黑屏强制关机后才能开怎么办
  12. 前端项目中如何去除已经不再使用的图片资源
  13. flowable中BPM实现核心对象
  14. 美团酒旅数据治理实践案例分享
  15. 使用OpenCV透视变换技术实现坐标变换实践
  16. 复盘在项目管理中的应用
  17. 元宇宙技术教程|如何一键生成虚拟人视频
  18. 【小程序】小程序组件-1
  19. SpringCloud学习笔记01
  20. HTTPS SSL证书

热门文章

  1. python之父名言_人生苦短 Python 格言
  2. 【自动驾驶】基于采样的路径规划算法——PRM(含python实现)
  3. worm/spybot_周末娱乐:在Spybot中搜索和销毁复活节彩蛋
  4. 设计模式练习(19)——策略模式
  5. C/C++ | sizeof()函数
  6. 基于C++模拟火车票售票系统【100010193】
  7. ​【预测模型】基于粒子群算法优化核极限学习机实现数据预测matlab代码
  8. php判断蜘蛛显示js,js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
  9. php排序数组排序_php简单实现多维数组排序的方法
  10. rapidjson创建json字符串