中介者模式属于行为型设计模式,旨在减少对象之间的耦合关系,通过引入一个中介者对象,将对象间复杂的交互转化为中介者与对象之间的简单交互,中介者模式实现了集中式控制,有助于系统的维护和扩展。
以下是一个使用中介者模式的示例,假设有多个同事对象(Colleague),这些同事对象以不同方式交互,为了解耦合,引入一个中介者对象(Mediator),该中介者对象负责协调所有同事对象之间的交互,如下所示:
在上图中,Colleague类是抽象同事类,具体同事类ConcreteColleague1和ConcreteColleague2继承自该类。Mediator是抽象中介者类,具体中介者类ConcreteMediator继承自该类并实现中介者的具体逻辑。
具体代码实现如下:
//抽象同事类
class Colleague
{
public:Colleague(Mediator* mediator) : m_mediator(mediator) {}virtual void sendMsg(std::string msg) = 0;virtual void receiveMsg(std::string msg) = 0;
protected:Mediator* m_mediator;
};//具体同事类1
class ConcreteColleague1 : public Colleague
{
public:ConcreteColleague1(Mediator* mediator) : Colleague(mediator) {}void sendMsg(std::string msg) override{m_mediator->sendMsg(msg, this);}void receiveMsg(std::string msg) override{std::cout << "ConcreteColleague1 received msg: " << msg << std::endl;}
};//具体同事类2
class ConcreteColleague2 : public Colleague
{
public:ConcreteColleague2(Mediator* mediator) : Colleague(mediator) {}void sendMsg(std::string msg) override{m_mediator->sendMsg(msg, this);}void receiveMsg(std::string msg) override{std::cout << "ConcreteColleague2 received msg: " << msg << std::endl;}
};//抽象中介者类
class Mediator
{
public:virtual void sendMsg(std::string msg, Colleague* sender) = 0;
};//具体中介者类
class ConcreteMediator : public Mediator
{
public:ConcreteMediator() {}void sendMsg(std::string msg, Colleague* sender) override{auto iter = m_colleagues.find(sender);if (iter != m_colleagues.end()){for (auto it = m_colleagues.begin(); it != m_colleagues.end(); ++it){if (it->first != iter->first){it->second->receiveMsg(msg);}}}}void addColleague(Colleague* colleague){m_colleagues[colleague] = colleague;}
private:std::map<Colleague*, Colleague*> m_colleagues;
};int main()
{ConcreteMediator mediator;ConcreteColleague1 colleague1(&mediator);ConcreteColleague2 colleague2(&mediator);mediator.addColleague(&colleague1);mediator.addColleague(&colleague2);colleague1.sendMsg("Hello, this is ConcreteColleague1.");colleague2.sendMsg("Hi, this is ConcreteColleague2.");return 0;
}
在上述代码中,Colleague类是抽象同事类,ConcreteColleague1和ConcreteColleague2是具体同事类,它们都继承自Colleague类,并实现了虚函数sendMsg和receiveMsg。Mediator是抽象中介者类,ConcreteMediator是具体中介者类,它们都继承自Mediator类,并实现了虚函数sendMsg。
在main函数中,创建了具体中介者ConcreteMediator对象以及两个具体同事ConcreteColleague1和ConcreteColleague2对象,并将它们加入ConcreteMediator对象的同事列表中。接着分别调用ConcreteColleague1对象和ConcreteColleague2对象的sendMsg函数,向ConcreteMediator对象发送消息,最终得到正确的输出结果。
总之,中介者模式通过引入中介者对象,将对象间复杂的交互转化为中介者与对象之间的简单交互,从而减少了对象之间的耦合关系。在实际应用中,开发人员可以根据实际需要灵活使用中介者模式,以获得更好的系统拓展性和可维护性。