中介者模式是一种行为型设计模式,它通过将对象之间的通信转发给中介者对象,从而解耦了对象之间的相互作用。中介者模式可以用于实现复杂的交互逻辑、协调多个对象之间的行为等应用。
下面是一个使用 C++ 实现中介者模式的示例代码:
#include <iostream>
#include <string>
#include <vector>
// 抽象中介者类
class Mediator {
public:
virtual ~Mediator() {}
virtual void Send(const std::string& message, const class Colleague* colleague) const = 0;
};
// 抽象同事类
class Colleague {
public:
virtual ~Colleague() {}
virtual void Receive(const std::string& message) const = 0;
virtual void Send(const std::string& message) const = 0;
void SetMediator(const Mediator* mediator) {
mediator_ = mediator;
}
protected:
const Mediator* mediator_;
};
// 具体中介者类:聊天室
class ChatRoom : public Mediator {
public:
void Send(const std::string& message, const Colleague* colleague) const override {
std::cout << colleague->GetName() << " sends message: " << message << std::endl;
for (const auto& c : colleagues_) {
if (c != colleague) {
c->Receive(message);
}
}
}
void Register(Colleague* colleague) {
colleagues_.push_back(colleague);
}
private:
std::vector<Colleague*> colleagues_;
};
// 具体同事类:用户
class User : public Colleague {
public:
User(const std::string& name) : name_(name) {}
void Receive(const std::string& message) const override {
std::cout << name_ << " receives message: " << message << std::endl;
}
void Send(const std::string& message) const override {
mediator_->Send(message, this);
}
const std::string& GetName() const {
return name_;
}
private:
std::string name_;
};
int main() {
// 创建聊天室对象
ChatRoom chat_room;
// 创建用户对象
User alice("Alice");
User bob("Bob");
User charlie("Charlie");
// 注册用户对象到聊天室
chat_room.Register(&alice);
chat_room.Register(&bob);
chat_room.Register(&charlie);
// 设置用户对象的中介者为聊天室
alice.SetMediator(&chat_room);
bob.SetMediator(&chat_room);
charlie.SetMediator(&chat_room);
// 用户对象之间发送消息
alice.Send("Hello, Bob and Charlie!");
bob.Send("Hi, Alice!");
charlie.Send("Nice to meet you all!");
return 0;
}
在上面的代码中,我们首先定义了一个 Mediator 抽象类,其中包含了 Send() 纯虚函数。具体中介者类 ChatRoom 实现了 Send() 函数,以转发消息给其他同事。抽象同事类 Colleague 定义了 Receive() 和 Send() 纯虚函数,用于接收和发送消息。具体同事类 User 实现了 Receive() 和 Send() 函数,以与聊天室中的其他用户交互。
在 main() 函数中,我们首先创建了一个聊天室对象 chat_room,然后创建了三个用户对象 alice、bob 和 charlie,并将它们注册到聊天室中。接着,我们设置了用户对象的中介者为聊天室。最后,我们让用户对象之间发送消息,并观察输出结果。
中介者模式的优点在于它将对象之间的相互作用转移到了中介者对象中,从而降低了对象之间的耦合度。同时,中介者模式也提供了一种集中式的控制方式,使得系统更易于维护和扩展。但是,由于中介者对象需要处理大量的逻辑,因此它可能会成为系统的瓶颈。