目录
中介者模式(Mediator Pattern)是一种【行为型】设计模式,它通过一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用,从而降低耦合度,并可以独立地改变它们之间的交互。这种模式将多对多的交互转化为一对多的交互,使系统更易于维护和扩展。
一、模式核心概念与结构
中介者模式包含四个核心角色:
- 抽象中介者(Mediator):定义统一的接口,用于各同事对象之间的通信。
- 具体中介者(Concrete Mediator):实现中介者接口,协调各同事对象的交互逻辑。
- 抽象同事类(Colleague):定义各同事类的公共接口,每个同事类都知道其中介者对象。
- 具体同事类(Concrete Colleague):实现抽象同事类,通过中介者与其他同事通信。
二、C++ 实现示例:聊天室系统
以下是一个简单的聊天室系统示例,演示如何使用中介者模式实现用户之间的通信:
#include <iostream>
#include <string>
#include <memory>
#include <unordered_map>
#include <vector>
// 前向声明
class ChatMediator;
// 抽象同事类:用户
class User {
protected:
std::shared_ptr<ChatMediator> mediator;
std::string name;
public:
User(std::shared_ptr<ChatMediator> m, const std::string& n)
: mediator(m), name(n) {
}
virtual ~User() = default;
virtual void send(const std::string& message) = 0;
virtual void receive(const std::string& message, const std::string& sender) = 0;
std::string getName() const {
return name; }
};
// 抽象中介者:聊天室
class ChatMediator {
public:
virtual ~ChatMediator() = default;
virtual void addUser(std::shared_ptr<User> user) = 0;
virtual void removeUser(std::shared_ptr<User> user) = 0;
virtual void sendMessage(const std::string& message, const std::string& sender, const std::string& receiver = "") = 0;
};
// 具体同事类:普通用户
class ConcreteUser : public User {
public:
ConcreteUser(std::shared_ptr<ChatMediator> m, const std::string& n)
: User(m, n) {
}
void send(const std::string& message) override {
std::cout << name << " sends message: " << message << std::endl;
mediator->sendMessage(message, name