中介者设计模式适用于以下情况:
• 一组对象以定义良好但复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解;
• 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象;
• 想定制一个分布在多个类中的行为,而又不想生成太多的子类;
下面是一个中介者模式的示例程序:
cpp
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class User; // Forward declaration
// =================================================================
// Step 1: THE MEDIATOR INTERFACE
// =================================================================
// Defines how components communicate with the central manager.
class ChatRoomMediator {
public:
virtual ~ChatRoomMediator() = default;
// Sends a message from a specific sender to everyone else
virtual void sendMessage(const std::string& message, User* sender) = 0;
};
// =================================================================
// Step 2: THE BASE COMPONENT CLASS (Colleague)
// =================================================================
// Objects that use the mediator to talk to each other.
class User {
protected:
std::string name_;
ChatRoomMediator& mediator_; // Reference to the central control tower
public:
User(const std::string& name, ChatRoomMediator& mediator)
: name_(name), mediator_(mediator) {}
virtual ~User() = default;
std::string getName() const { return name_; }
// Send a message out to the world (routed via the mediator)
void send(const std::string& message) {
std::cout << "\n[" << name_ << " sends]: " << message << "\n";
mediator_.sendMessage(message, this);
}
// Receive a message coming in from the mediator
void receive(const std::string& message, const std::string& fromWho) {
std::cout << " -> " << name_ << " received a message from " << fromWho << ": \"" << message << "\"\n";
}
};
// =================================================================
// Step 3: THE CONCRETE MEDIATOR
// =================================================================
// Implements coordination logic by holding a list of all chatters.
class TextChatRoom : public ChatRoomMediator {
private:
std::vector<User*> users_; // Tracks all active colleagues in the room
public:
void addUser(User* user) {
users_.push_back(user);
}
void sendMessage(const std::string& message, User* sender) override {
// Broadcast the message to every user EXCEPT the person who sent it
for (User* user : users_) {
if (user != sender) {
user->receive(message, sender->getName());
}
}
}
};
// =================================================================
// Step 4: CLIENT CODE
// =================================================================
int main() {
// 1. Set up the central control tower (the mediator)
TextChatRoom codingChatRoom;
// 2. Create users and hook them up to the central chat room
User alice("Alice", codingChatRoom);
User bob("Bob", codingChatRoom);
User charlie("Charlie", codingChatRoom);
// 3. Register users inside the mediator's tracking list
codingChatRoom.addUser(&alice);
codingChatRoom.addUser(&bob);
codingChatRoom.addUser(&charlie);
std::cout << "=== Chat Room Activity Started ===\n";
// 4. Users send messages. Notice they never directly interact with each other!
alice.send("Hey everyone! Are we ready for the code review?");
bob.send("Yes, looks good to me.");
return 0;
}
程序运行结果如下:
shell
$ g++ -o main main.cpp
$ ./main
=== Chat Room Activity Started ===
[Alice sends]: Hey everyone! Are we ready for the code review?
-> Bob received a message from Alice: "Hey everyone! Are we ready for the code review?"
-> Charlie received a message from Alice: "Hey everyone! Are we ready for the code review?"
[Bob sends]: Yes, looks good to me.
-> Alice received a message from Bob: "Yes, looks good to me."
-> Charlie received a message from Bob: "Yes, looks good to me."