中介者设计模式(Mediator Pattern)是一种行为设计模式,它用一个中介对象来封装一系列对象之间的交互,使这些对象不需要互相显式地引用,从而降低它们之间的耦合性。本文将详细介绍如何在C++中实现中介者设计模式。
什么是中介者设计模式?
中介者模式的主要目的是减少对象之间的直接依赖性,将多个对象之间复杂的通讯关系简化为由中介者对象管理。通过中介者模式,每个对象仅仅需要和中介者对象打交道,而不需要了解其他对象的实现细节。
中介者设计模式的结构
中介者模式主要包含以下几个部分:
抽象中介者(Mediator)
定义一个接口,用于与各同事对象通信。
具体中介者(ConcreteMediator)
实现抽象中介者接口,协调各同事对象之间的交互。通常会持有所有同事对象的引用。
抽象同事类(Colleague)
定义同事类的接口,保存中介者对象的引用。
具体同事类(ConcreteColleague)
实现抽象同事类,具体实现与其他同事对象的交互。
在C++中实现中介者模式
下面通过一个简单的例子来演示如何在C++中实现中介者设计模式。假设我们有几个用户(User)需要通过一个聊天中介者(ChatMediator)来发送消息。
定义抽象中介者接口
#include
#include
#include
class User;
// 抽象中介者接口
class ChatMediator {
public:
virtual void sendMessage(const std::string &msg, User *user) = 0;
virtual void addUser(User *user) = 0;
};
定义具体中介者类
#include
// 具体中介者类
class ChatMediatorImpl : public ChatMediator {
private:
std::vector users;
public:
void sendMessage(const std::string &msg, User *user) override;
void addUser(User *user) override {
users.push_back(user);
}
};
void ChatMediatorImpl::sendMessage(const std::string &msg, User *user) {
for (auto u : users) {
if (u != user) {
u->receive(msg);
}
}
}
定义抽象同事类
// 抽象同事类
class User {
protected:
ChatMediator *mediator;
std::string name;
public:
User(ChatMediator *med, const std::string &name) : mediator(med), name(name) {}
virtual void send(const std::string &msg) = 0;
virtual void receive(const std::string &msg) = 0;
};
定义具体同事类
// 具体同事类
class ConcreteUser : public User {
public:
ConcreteUser(ChatMediator *med, const std::string &name) : User(med, name) {}
void send(const std::string &msg) override {
std::cout << name << "发送消息:" << msg << std::endl;
mediator->sendMessage(msg, this);
}
void receive(const std::string &msg) override {
std::cout << name << "收到消息:" << msg << std::endl;
}
};
示例代码
int main() {
ChatMediatorImpl *mediator = new ChatMediatorImpl();
User *user1 = new ConcreteUser(mediator, "Alice");
User *user2 = new ConcreteUser(mediator, "Bob");
User *user3 = new ConcreteUser(mediator, "Charlie");
mediator->addUser(user1);
mediator->addUser(user2);
mediator->addUser(user3);
user1->send("Hello, everyone!");
user2->send("Hi, Alice!");
delete user1;
delete user2;
delete user3;
delete mediator;
return 0;
}
总结
通过上述示例,可以看到中介者模式在C++中的实现。中介者模式通过引入独立的中介者对象来管理对象之间的通讯,降低了对象之间的耦合度,从而提升了代码的可维护性和可扩展性。在实际开发中,中介者模式特别适用于那些对象之间通讯复杂且相互依赖的场景。