设计模式之中介者模式(C++)

简介: 设计模式之中介者模式(C++)

一、中介者模式是什么?

      中介者模式是一种行为型的软件设计模式,也称为仲裁者模式,顾名思义,该模式的作用就是中介,帮助其他类进行良好的交流。


      类之间关系混乱的时候,会有很强的耦合性。就拿租房为例,如果有10个租客,5个房东,他们各自单线联系,那么他们之间的交流会相对混乱,维护起来也复杂的多。此时出现了一个房产中介,它将租客和房东的信息整合起来,由中介安排合适的租客和房东交流,那么交流就变得高效且清晰,当然也要付费的(就像增加中介类的代码维护开销一样)。


      中介者模式的优点:


  1. 解耦。中介的存在使得同事对象间的强耦合关系解除,它们可以独立地变化而不会影响到整体,便于被复用。
  2. 良好扩展性。交互行为发生改变,只需要扩展中介即可。
  3. 集中交互,便于管理。

     中介者模式的缺点:


  1. 中介者的职责很重要,且复杂。

二、中介者模式

2.1 结构图

      客户端即Main主函数,人和中介互相关联。

2.2 代码示例

      场景描述:房东和租客通过房产中介交流。

//Mediator.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>
using namespace std;
class Person;
// 抽象中介者
class Mediator 
{
public:
  // 发出信息
  virtual void sendMessage(std::string message, Person* colleague) = 0;
};
// 抽象类-人
class Person
{
public:
  // 构造函数
  Person(Mediator* mediator) : m_mediator(mediator) {}
  // 发出消息
  virtual void sendMessage(std::string message) = 0;
  // 获取消息
  virtual void getMessage(std::string message) = 0;
protected:
  Mediator* m_mediator;
};
// 具体类-租客
class Tenant : public Person
{
public:
  // 构造函数
  Tenant(Mediator* mediator) : Person(mediator) {}
  // 发出消息
  virtual void sendMessage(std::string message) {
    m_mediator->sendMessage(message, this);
  }
  // 获取消息
  virtual void getMessage(std::string message) {
    std::cout << "租客得到消息:" << message << std::endl;
  }
};
// 具体类-房东
class Landlord : public Person 
{
public:
  // 构造函数
  Landlord(Mediator* mediator) : Person(mediator) {}
  // 发出消息
  virtual void sendMessage(std::string message) {
    m_mediator->sendMessage(message, this);
  }
  // 获取消息
  virtual void getMessage(std::string message) {
    std::cout << "房东得到消息:" << message << std::endl;
  }
};
// 具体中介者-房产中介
class RealEstateMediator : public Mediator
{
public:
  // 设置租客
  void setTenant(Person* tenant) {
    m_tenant = tenant;
  }
  // 设置房东
  void setLandlord(Person* landlord) {
    m_landlord = landlord;
  }
  // 发出信息
  virtual void sendMessage(std::string message, Person* colleague) {
    if (colleague == m_tenant) {
      m_landlord->getMessage(message);
    }
    else {
      m_tenant->getMessage(message);
    }
  }
private:
  Person* m_tenant;
  Person* m_landlord;
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Iterator.h"
using namespace std;
int main() 
{
  // 创建对象
  RealEstateMediator *mediator = new RealEstateMediator();
  Person *tenant = new Tenant(mediator);
  Person *landlord = new Landlord(mediator);
  // 中介设置房东和租客
  mediator->setTenant(tenant);
  mediator->setLandlord(landlord);
  // 进行租房询问
  tenant->sendMessage("房租多少钱?");
  landlord->sendMessage("房租3000元。");
  // 删除
  delete mediator;
  delete tenant;
  delete landlord;
  mediator = nullptr;
  tenant = nullptr;
  landlord = nullptr;
  return 0;
}

     程序结果如下。

      租客向中介发出消息,中介将消息转给了房东,反之亦然。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对中介者模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解中介者模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
1月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
61 0
|
1月前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
26 0
|
1月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
29 1
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
3月前
|
设计模式 算法 Java
C++设计模式
C++设计模式
16 0
|
3天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
4天前
|
设计模式 调度
【设计模式系列笔记】中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它通过将对象之间的直接通信转移到一个中介对象中,来减少对象之间的耦合度。这种模式被用来处理一个对象与其他对象之间的交互,使得各对象之间不需要直接相互了解。
13 0
|
30天前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
114 1
|
1月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
21 1
|
1月前
|
设计模式 存储 算法
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(三)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
24 0