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

四、优缺点总结

优点:

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

缺点:

  • 中介者可能变得复杂:如果同事类过多,中介者会变得庞大
  • 性能问题:所有通信都通过中介者,可能成为性能瓶颈
  • 单点故障:中介者故障会影响整个系统
相关推荐
CSCN新手听安4 小时前
【Qt】Qt窗口(八)QFontDialog字体对话框,QInputDialog输入对话框的使用,小结
开发语言·c++·qt
tumu_C5 小时前
用std::function减缓C++模板代码膨胀和编译压力的一个场景
开发语言·c++
Hical616 小时前
C++17 实战心得:那些真正改变我写代码方式的特性
c++
Hical616 小时前
实测:C++20 协程 vs Go Gin vs Rust Actix,谁的 Web 性能更强?
c++
草莓熊Lotso7 小时前
《告别 “会用不会讲”:C++ string 底层原理拆解 + 手撕实现,面试 / 开发都适用》
开发语言·c++·面试
会编程的土豆7 小时前
【数据结构与算法】空间复杂度从入门到面试:不仅会算,还要会解释
数据结构·c++·算法·面试·职场和发展
张槊哲7 小时前
C++ 进阶指南:如何丝滑地理解与实践多线程与多进程
开发语言·c++·算法
雪度娃娃7 小时前
Effective Modern C++——型别推导
开发语言·c++
Hello eveybody7 小时前
介绍一下背包DP(C++)
开发语言·c++·动态规划·dp·背包dp