中介者模式 是一种行为型设计模式,它用一个中介对象来封装一组对象之间的交互。中介者通过协调多个对象之间的通信,避免对象之间的直接依赖,从而实现对象之间的松耦合。
以下代码展示了中介者模式的实现,模拟一个聊天室中的用户通过中介者进行通信的场景。
#include
#include
#include
#include
// 前置声明中介者
class Mediator;
// 同事类接口
class Colleague {
protected:
Mediator* mediator; // 中介者指针
std::string name; // 同事名称
public:
Colleague(Mediator* mediator, std::string name) : mediator(mediator), name(std::move(name)) {}
virtual ~Colleague() = default;
// 接收消息
virtual void receiveMessage(const std::string& sender, const std::string& message) = 0;
// 发送消息
virtual void sendMessage(const std::string& message) = 0;
std::string getName() const {
return name;
}
};
// 中介者接口
class Mediator {
public:
virtual ~Mediator() = default;
// 注册同事
virtual void addColleague(std::shared_ptr<Colleague> colleague) = 0;
// 转发消息
virtual void relayMessage(const std::string& sender, const std::string& message) = 0;
};
// 具体中介者
class ChatMediator : public Mediator {
private:
std::vector<std::shared_ptr<Colleague>> colleagues; // 同事列表
public:
void addColleague(std::shared_ptr<Colleague> colleague) override {
colleagues.push_back(std::move(colleague));
}
void relayMessage(const std::string& sender, const std::string& message) override {
for (const auto& colleague : colleagues) {
if (colleague->getName() != sender) {
colleague->receiveMessage(sender, message); // 转发消息给其他同事
}
}
}
};
// 具体同事类
class User : public Colleague {
public:
User(Mediator* mediator, std::string name) : Colleague(mediator, std::move(name)) {}
void receiveMessage(const std::string& sender, const std::string& message) override {
std::cout << name << " 收到来自 " << sender << " 的消息: " << message << "
";
}
void sendMessage(const std::string& message) override {
std::cout << name << " 发送消息: " << message << "
";
mediator->relayMessage(name, message); // 通过中介者发送消息
}
};
// 客户端代码
int main() {
// 创建中介者
auto chatMediator = std::make_shared<ChatMediator>();
// 创建用户
auto user1 = std::make_shared<User>(chatMediator.get(), "Alice");
auto user2 = std::make_shared<User>(chatMediator.get(), "Bob");
auto user3 = std::make_shared<User>(chatMediator.get(), "Charlie");
// 注册用户到中介者
chatMediator->addColleague(user1);
chatMediator->addColleague(user2);
chatMediator->addColleague(user3);
// 用户发送消息
user1->sendMessage("大家好!");
user2->sendMessage("你好,Alice!");
user3->sendMessage("欢迎加入聊天室!");
return 0;
}
addColleague
用于注册同事对象,relayMessage
用于转发消息。class Mediator {
public:
virtual ~Mediator() = default;
virtual void addColleague(std::shared_ptr<Colleague> colleague) = 0;
virtual void relayMessage(const std::string& sender, const std::string& message) = 0;
};
class ChatMediator : public Mediator {
private:
std::vector<std::shared_ptr<Colleague>> colleagues;
public:
void addColleague(std::shared_ptr<Colleague> colleague) override {
colleagues.push_back(std::move(colleague));
}
void relayMessage(const std::string& sender, const std::string& message) override {
for (const auto& colleague : colleagues) {
if (colleague->getName() != sender) {
colleague->receiveMessage(sender, message);
}
}
}
};
sendMessage
和 receiveMessage
。class Colleague {
protected:
Mediator* mediator;
std::string name;
public:
Colleague(Mediator* mediator, std::string name) : mediator(mediator), name(std::move(name)) {}
virtual ~Colleague() = default;
virtual void receiveMessage(const std::string& sender, const std::string& message) = 0;
virtual void sendMessage(const std::string& message) = 0;
std::string getName() const { return name; }
};
class User : public Colleague {
public:
User(Mediator* mediator, std::string name) : Colleague(mediator, std::move(name)) {}
void receiveMessage(const std::string& sender, const std::string& message) override {
std::cout << name << " 收到来自 " << sender << " 的消息: " << message << "
";
}
void sendMessage(const std::string& message) override {
std::cout << name << " 发送消息: " << message << "
";
mediator->relayMessage(name, message);
}
};
中介者模式通过引入中介者对象,降低了对象之间的耦合性,同时集中管理了交互逻辑。它特别适用于对象间交互复杂且需要统一管理的场景。