概述
中介模式,顾名思义,通过一个中介来完成信息的流动,例如找房子,每个人可以直接跟另一个人联系买房,但如果人数很多,而买方又希望多方比价,那么每个人跟每个人之间的关系会变得十分复杂,而且效率较低,在现实生活中,我们往往通过中介来解决这个问题,所有人(无论买方或是卖方),都将信息发送到中介,再从中介获取信息,或者使用观察者模式订阅某个信息,中介主要起到信息转发的作用;同样的类似QQ,会先将消息发送到服务器,再由服务器转发到接收方。
代码实现
class Customer;
class Mediator {
public:
static Mediator *GetMediator() {
static std::once_flag once_flag;
std::call_once(once_flag,
[]() { mediator_ = std::make_unique<Mediator>(); });
return mediator_.get();
}
void Register(Customer *customer);
void Relay(const std::string &msg);
private:
Mediator() = default;
static std::unique_ptr<Mediator> mediator_;
std::vector<Customer *> customers_;
};
class Customer {
public:
Customer() : mediator_(Mediator::GetMediator()) { mediator_->Register(this); }
virtual void Send() = 0;
virtual void Receive(const std::string &msg) = 0;
protected:
Mediator *mediator_;
};
class Customer_1 : public Customer {
public:
void Send() override {
std::string msg = "Customer 2, I love you, do you love me?";
mediator_->Relay(msg);
}
void Receive(const std::string &msg) override {
if (msg == "Yes" || msg == "y") {
std::cout << "I'm so happy!" << std::endl;
}
}
};
class Customer_2 : public Customer {
public:
void Send() override {
std::string msg = "No";
mediator_->Relay(msg);
}
void Receive(const std::string &msg) override {
std::cout << "Don't bother me." << std::endl;
}
};
void Mediator::Register(Customer *customer) { customers_.push_back(customer); }
void Mediator::Relay(const std::string &msg) {
for (auto k : customers_) {
k->Receive(msg);
}
}
int main(){
Customer* customer1 = new Customer_1();
Customer* customer2 = new Customer_1();
customer1->Send();
customer2->Send();
}
中介模式一个典型的案例是ROS中的master节点,虽然它带来很多方便,但由于master节点有着至关重要的地位,一旦master节点crash导致整个系统挂掉,因此中介模式在不同情况下也需要慎用。