中介者模式看了许久,不能理解其中的奥妙所在。但是不打算在这个模式上再多花时间,先在此记录下,日后代码熟练后在回过头来回顾一下。
模式目标:
中介者模式的目标是为了减少多个对象之间的交互,将一种网状的交互状态简化为星状的交互状态,这样就各个对象就需要通过一个中介来传送信息。
看了Gamma的设计模式一书中举的例子,此模式用在设计一个界面,界面上有按钮,下拉列表,输入框,这几种界面上的对象,如果有一种发生变化,其他对象相应的也要发生改变,比如下拉列表中如果选择了某种字体,那么对应的按钮和输入框中的字体也要发生改变,那么此时可以使用中介者模式来实现。
当然我看的是大话里面的,里面的代码相对来说简单一点,在此贴下代码,以便后面回顾:
#include <iostream>
using namespace std;
class Colleague;
// 中介者接口类,如果后续有多个中介,可以从此类派生
class Mediator
{
public:
virtual void Send (string msg, Colleague* clg) = 0;
virtual void CreateColleague () = 0;
};
// 交互对象超类,持有中介者对象,以便和中介打交道
class Colleague
{
protected:
Mediator *mediator;
public:
Colleague (Mediator *med) : mediator (med) {}
virtual void Notify (string msg) {}
};
// 具体的交互对象
class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1 (Mediator *med) : Colleague (med) {}
void Send (string msg)
{
mediator->Send (msg, this);
}
void Notify (string msg)
{
cout << "ConcreteColleague1" << ": " << msg << endl;
}
};
class ConcreteColleague2 : public Colleague
{
public:
ConcreteColleague2 (Mediator *med) : Colleague (med) {}
void Send (string msg)
{
mediator->Send (msg, this);
}
void Notify (string msg)
{
cout << "ConcreteColleague2" << ": " << msg << endl;
}
};
// 具体的中介者类,持有各个交互对象。
class ConcreteMediator : public Mediator
{
public:
void Send (string msg, Colleague *clg);
protected:
virtual void CreateColleague ();
private:
ConcreteColleague1 *clg1;
ConcreteColleague2 *clg2;
};
void ConcreteMediator::CreateColleague ()
{
clg1 = new ConcreteColleague1 (this);
clg2 = new ConcreteColleague2 (this);
}
void ConcreteMediator::Send (string msg, Colleague *clg)
{
if (clg == clg1)
{
clg2->Notify (msg);
}
else if (clg == clg2)
{
clg1->Notify (msg);
}
}
#endif
代码有问题。 ConcreteMediator 这个类具体不知道怎么处理。