设计模式—行为型-Mediator(中介者)
1. 意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
2. 结构图
3. 简述
一些对象存在依赖关系,常见的如一个对话框中的各个控件之间,一个CheckBox的选择可能会导致一个Static中文字的改变,或是一个Button的禁用等。如果这个依赖关系的逻辑放在这些对象之中,那么所有对象会交织在一起,成为一个不可分割的整体。如果使用一个“中介”来管理这些对象之间的依赖关系,则大大提高各个对象的可复用性。
最常见的应用如MFC中的C*Dialog类,用于管理各个控件对象的依赖关系。另一种应用似是观察者模式中提到的ChangeManager类,协调subject和observer之间的Notify和Update等以避免冗余的更新。
4. 实例代码
// Mediator
class Dialog
{
virtual ~ Dialog();
virtual void CreateDialog();
virtual void ControlChanged() = 0;
};
class Control
{
Dialog* _dialog;
public:
Control ();
Virtual void Changed()
{
_dialog->ControlChanged();
}
virtual void HandleKeyboard(KeyboardEvent& event);
virtual void HandleMouse(MouseEvent& event);
};
class Button : public Control
{
…
};
class EditBox : public Control
{
…
};
// Mediator
class Dialog
{
virtual ~ Dialog();
virtual void CreateDialog();
virtual void ControlChanged() = 0;
};
class Control
{
Dialog* _dialog;
public:
Control ();
Virtual void Changed()
{
_dialog->ControlChanged();
}
virtual void HandleKeyboard(KeyboardEvent& event);
virtual void HandleMouse(MouseEvent& event);
};
class Button : public Control
{
…
};
class EditBox : public Control
{
…
};