【定义】中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互应用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
【场景】一个窗口中有两个控件,一个按钮Button和编辑框Label,现在要单机按钮则编辑框改变文本,如果将编辑框改变文本的代码放到按钮的单机事件处理函数里面,那这两个对象便是耦合的。现在可以将窗口Window作为一个中介者,让按钮跟窗口交互,然后窗口再跟编辑框交互,这样就接触了按钮和编辑框之间的相互影响了。
【UML】
【Code】
#include <iostream>
using namespace std;
class Mediator;
class Widget
{
protected:
Mediator* mediator;
public:
Widget(Mediator* m):mediator(m){}
virtual void send(int msg_id) = 0;
virtual void notify(int msg_id) = 0;
};
class Mediator
{
public:
virtual void send(int msg_id, Widget* w) = 0;
};
class Button : public Widget
{
public:
Button(Mediator* m):Widget(m){}
void send(int msg_id)
{
mediator->send(msg_id, this);
}
void notify(int msg_id)
{
cout<<"Button receive msg:"<<msg_id<<endl;
}
};
class Label : public Widget
{
public:
Label(Mediator* m):Widget(m){}
void send(int msg_id)
{
mediator->send(msg_id, this);
}
void notify(int msg_id)
{
cout<<"Label receive msg:"<<msg_id<<endl;
}
};
class Window : public Mediator
{
private:
Widget* btn;
Widget* label;
public:
void set_widget(Widget* b, Widget* l)
{
btn = b;
label = l;
}
void send(int msg_id, Widget* w)
{
if(w == btn)
{
label->notify(msg_id);
}
if(w == label)
{
btn->notify(msg_id);
}
}
};
int main()
{
Window* window = new Window;
Widget* btn = new Button(window);
Widget* label = new Label(window);
window->set_widget(btn, label);
btn->send(1005);
label->send(2004);
delete window;
delete btn;
delete label;
return 0;
}
【运行结果】