中介者模式

来源:互联网 发布:算法设计技巧与分析 编辑:程序博客网 时间:2024/06/09 14:28

参考博文:
http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/30/2663922.html
http://blog.csdn.net/zhengzhb/article/details/7430098

一、初识中介者模式

那些年,我们一起上过的大学,班级里有班长,有团书记。想一想如果没有QQ这种通讯工具的话,那么班长或者团支书该怎样下达消息呢??同时,班级上两个同学之间也可惜沟通啊,沟通一下,院里哪个女生,哪个帅哥呀~~~如果没有QQ的话,大概就是下面的情景:
这里写图片描述

哎呀呀,看看这个乱那。如果同学的数目多起来就会变成网状的结构啦。原本把一个系统分割成一些对象是可以增强复用性的,但是现在的情况是,这些兑现之间存在着大量的联系,耦合性极高。这是很不利于复用的,同时这种情况使得系统的灵活性大大的降低,使得对系统的扩展很难,要是新转来一个学生的话,要改动的地方就多了去了。
这里写图片描述
如果现在可以使用QQ,那么可以采用另一种方式设计这个系统呢,比如做成星形的结构:

看看这种“星形结构”和“网状结构”的区别吧,显然采用星形结构就可以避免上面的网状结构存在的问题了,实际上这里的QQ就是指的是中介,这样一来每个学生对象就不用存在耦合了,同学之间需要交流可以通过一个QQ群。

本人认为,由原来的网状结构到星形结构的转变是理解中介者模式比较好的途径,下面来具体看看中介者模式,GoF说:
中介者模式(Mediator Pattern):定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。


定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
类型:行为类模式
类图这里写图片描述


二、C++代码

#define  _CRT_SECURE_NO_WARNINGS    //关闭安全检查#include <iostream>#include <string>#include <vector>using namespace std;// 抽象的同事类class Colleage{private:    string name;    string content;public:    Colleage(string n = " ") :name(n){};    void setName(string name)    {        this->name = name;    }    string getName()    {        return this->name;    }    void setContent(string content)    {        this->content = content;    }    string getContent()    {        return this->content;    }    virtual void talk() = 0;};// 具体的同事类:班长class Monitor : public Colleage{public:    Monitor(string n = " ") :Colleage(n) {};    virtual void talk()    {        cout << "大班长 说:" << getContent() << endl;    }};// 具体的同事类:团支书class TuanZhiShu : public Colleage{public:    TuanZhiShu(string n = " ") :Colleage(n) {};    virtual void talk()    {        cout << "团支书 说:" << getContent() << endl;    }};// 具体的同事类:同学Aclass StudentA : public Colleage{public:    StudentA(string n = " ") :Colleage(n) {};    virtual void talk()    {        cout << "同学A 说:" << getContent() << endl;    }};// 具体的同事类:同学Bclass StudentB : public Colleage{public:    StudentB(string n = " ") :Colleage(n) {};    virtual void talk()    {        cout << "同学B 说:" << getContent() << endl;    }};class Mediator{public:    vector<Colleage*> studentList;    virtual void addStudent(Colleage *student)    {        studentList.push_back(student);    }    virtual void notify(Colleage *student) = 0;    virtual void chart(Colleage *student1, Colleage *student2) = 0;};class QQMediator : public Mediator{public:    virtual void notify(Colleage *student)    {        student->talk();        for (int i = 0; i < studentList.size(); ++i)        {            // 不是说话者            if (student != studentList[i])            {                studentList[i]->talk();            }        }    }    virtual void chart(Colleage *student1, Colleage *student2)    {        student1->talk();        student2->talk();    }};int main(){    QQMediator qq;    Monitor studentMonitor("Vincent");    TuanZhiShu studentTuanZhiShu("Robort");    StudentA studentA("Sam");    StudentB studentB("Tony");    /*----------------------班长发通知-----------------------------*/    cout << "下面的班长发布一个通知的场景:" << endl;    //将同学们加入到qq群中    qq.addStudent(&studentMonitor);    qq.addStudent(&studentTuanZhiShu);    qq.addStudent(&studentA);    qq.addStudent(&studentB);    //设置大家的回复信息    studentMonitor.setContent("明天下午2点开年级会,收到回复^^。");    studentTuanZhiShu.setContent("知道了,肯定到!!");    studentA.setContent("收到了,但是可能晚点到!!");    studentB.setContent("收到了,但是明天要去面试!!");    //开始发通知    qq.notify(&studentMonitor);    /*--------------------两个同学私下交流--------------------------*/    cout << endl << "下面是两个同学的私下交流:" << endl;    studentMonitor.setContent("你觉得咱们“软件项目管理老师”讲的怎么样?");    studentA.setContent("我觉得讲的不够生动,还点名,不太好!!!");    qq.chart(&studentMonitor, &studentA);    system("pause");    return 0;}

执行结果


三、中介者模式使用场景

1.一组定义良好的对象,现在要进行复杂的通信。
2.定制一个分布在多个类中的行为,而又不想生成太多的子类。

中介对象主要是用来封装行为的,行为的参与者就是那些对象,但是通过中介者,这些对象不用相互知道。
在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。可以将网状结构变为星状结构,使同事类之间的关系变的清晰一些。
中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。


四、中介者模式的优缺点

优点:
1.降低了系统对象之间的耦合性,使得对象易于独立的被复用
2.提高系统的灵活性,使得系统易于扩展和维护:
- 可将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护
- 可将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用

缺点:
“中介“承担了较多的责任,一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响

0 0
原创粉丝点击