设计模式(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;
}

四、优缺点总结

优点:

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

缺点:

  • 中介者可能变得复杂:如果同事类过多,中介者会变得庞大
  • 性能问题:所有通信都通过中介者,可能成为性能瓶颈
  • 单点故障:中介者故障会影响整个系统
相关推荐
咩咦16 小时前
C++学习笔记28:静态成员应用:不用循环求1到n的和
c++·学习笔记·类和对象·static·构造函数·oj·静态成员
EllinY17 小时前
CF2217E Definitely Larger 题解
c++·笔记·算法·构造
筠筠喵呜喵17 小时前
Linux软件开发性能优化
linux·c++·性能优化
Bruce_kaizy18 小时前
c++ linux环境编程——文件io介绍以及open 、write 、read 三剑客深度详解
linux·服务器·c++·ubuntu·操作系统·文件io
PAK向日葵20 小时前
我用 C++ 写了一个轻量级 Python 虚拟机,刚刚开源
c++·python·开源
玖釉-20 小时前
下一个排列:从字典序到原地算法的完整推导
数据结构·c++·windows·算法
枕星而眠20 小时前
数据结构八大排序详解(一):四大简单排序
c语言·数据结构·c++·后端
努力努力再努力wz21 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
yunn_21 小时前
单例模式两种实现方法
开发语言·c++·单例模式
sinat_255487811 天前
IDEA:查找文件/类
java·ide·设计模式·intellij-idea