中介者模式属于行为型设计模式,旨在减少对象之间的耦合关系,通过引入一个中介者对象,将对象间复杂的交互转化为中介者与对象之间的简单交互,中介者模式实现了集中式控制,有助于系统的维护和扩展。
以下是一个使用中介者模式的示例,假设有多个同事对象(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对象发送消息,最终得到正确的输出结果。
总之,中介者模式通过引入中介者对象,将对象间复杂的交互转化为中介者与对象之间的简单交互,从而减少了对象之间的耦合关系。在实际应用中,开发人员可以根据实际需要灵活使用中介者模式,以获得更好的系统拓展性和可维护性。