设计模式(C++)-行为型模式-中介者模式

设计模式(C++)-行为型模式-中介者模式

一、中介者模式概述

中介者模式是一种行为型模式,用于减少多个对象或类之间的通信复杂性。它通过提供一个中介类处理不同类之间的通信,从而降低它们之间的耦合度,使得代码更易于维护和扩展。

二、中介者模式UML类图

中介者模式场景

在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信。在系统比较小的时候,可能对象间的通信不是很多、对象也比较少,我们可以直接硬编码到各个对象的方法中。但是当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式

三、代码实现

cpp 复制代码
//mediator.h
#pragma once
/*
中介者模式(Mediator Pattern)
是软件工程中的一种设计模式,属于行为型模式。
它定义了一个中介对象,用于封装一系列对象之间的交互,使得这些对象不需要显式地相互引用。
通过这种封装,可以降低系统的耦合度,并且使得对象间的关系更加清晰。
在C/C++中实现中介者模式通常包含以下几个步骤:
定义中介者接口:创建一个中介者类,该类包含所有需要协调的对象的引用。
实现中介者类:实现中介者接口,定义协调各个对象交互的方法。
定义同事类:创建一组同事类,这些类需要通过中介者进行通信。
实现同事类:实现同事类,确保每个同事类都持有中介者的引用,并通过中介者与其他同事类进行交互。
场景:在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信。在系统比较小的时候,
可能对象间的通信不是很多、对象也比较少,我们可以直接硬编码到各个对象的方法中。但是当系统规模变大,对象的量变引起系统复杂度的急剧增
加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式
*/
#include <string>
#include <vector>
#include <iostream>
class Colleague;
//定义中介接口类
class Mediator {
public:
	virtual void addColleague(Colleague *colleague) = 0;
	virtual void send(const std::string&msg,Colleague*colleague) = 0;
};
//定义具体的中介类
class ConcreteMediator :public Mediator {
public:
	virtual void send(const std::string&msg, Colleague*colleague);
	virtual void addColleague(Colleague *colleague);
private:
	std::vector<Colleague *> colleagues;
};

//定义同事类接口
class Colleague {
public:
	Colleague(Mediator* m) :mediator(m) {}
	virtual void send(const std::string&msg) = 0;
	virtual void notify(const std::string&msg) = 0;
protected:
	Mediator* mediator;
};

//定义具体的同事类
class ConcreteColleague1 :public Colleague {
public:
	ConcreteColleague1(Mediator* m) :Colleague(m) {}
	virtual void send(const std::string&msg);
	virtual void notify(const std::string&msg);
};

class ConcreteColleague2 :public Colleague {
public:
	ConcreteColleague2(Mediator* m) :Colleague(m) {}
	virtual void send(const std::string&msg);
	virtual void notify(const std::string&msg);
};

void testMediator();
//mediator.cc
#include "mediator.h"
void ConcreteMediator::send(const std::string&msg, Colleague*colleague) {
	for (auto c : colleagues) {
		if (c != colleague) // 不向自己发送消息
			c->notify(msg);
	}
}
void ConcreteMediator::addColleague(Colleague *colleague) {
	colleagues.emplace_back(colleague);
}
void ConcreteColleague1::send(const std::string&msg) {
	mediator->send(msg, this);
}
void ConcreteColleague1::notify(const std::string&msg) {
	std::cout << "ConcreteColleague1 received: " << msg << std::endl;
}

void ConcreteColleague2::send(const std::string&msg) {
	mediator->send(msg, this);
}
void ConcreteColleague2::notify(const std::string&msg) {
	std::cout << "ConcreteColleague2 received: " << msg << std::endl;
}
void testMediator() {
	std::cout << "=================mediator start===============" << std::endl;
	Mediator*        mediator = new  ConcreteMediator();
	ConcreteColleague1* c1 = new ConcreteColleague1(mediator);
	ConcreteColleague2* c2 = new ConcreteColleague2(mediator);

	mediator->addColleague(c1);
	mediator->addColleague(c2);

	c1->send("Hello");
	c2->send("World");

	delete c1;
	c1 = nullptr;
	delete c2;
	c2 = nullptr;

	delete mediator;
	mediator = nullptr;
	std::cout << "=================mediator end===============" << std::endl;
}

四、优缺点总结

优点:

  • 降低耦合度:将对象间多对多的关系转变为一对多的关系
  • 符合迪米特法则:对象只需与中介者通信
  • 简化对象协议:用于一对多的交互替代多对多的交互
  • 易于扩展:新增同事类不需要修改已有同事类

缺点:

  • 中介者可能变得复杂:如果同事类过多,中介者会变得庞大
  • 性能问题:所有通信都通过中介者,可能成为性能瓶颈
  • 单点故障:中介者故障会影响整个系统
相关推荐
_wyt00116 分钟前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
咖啡八杯3 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
玖玥拾4 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you5 小时前
constexpr函数
c++
凡人叶枫6 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫6 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss6 小时前
BRpc使用
c++·rpc
-森屿安年-6 小时前
63. 不同路径 II
c++·算法·动态规划
chase_my_dream6 小时前
Cartographer详细讲解
c++·人工智能·自动驾驶
森G6 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt