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

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

看看这种“星形结构”和“网状结构”的区别吧,显然采用星形结构就可以避免上面的网状结构存在的问题了,实际上这里的QQ就是指的是中介,这样一来每个学生对象就不用存在耦合了,同学之间需要交流可以通过一个QQ群。
本人认为,由原来的网状结构到星形结构的转变是理解中介者模式比较好的途径,下面来具体看看中介者模式,GoF说:
中介者模式(Mediator Pattern):定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。
看看结构图的形象描述吧:

对于设计模式这个东西,理解了,应该写一个代码体会一下:看看这些类,比如:Mediator,ConcreteMediator,Colleague和ConcreteColleage1到底是怎么组织的。

1 #include <iostream>
2 #include <vector>
3 #include <string>
4
5 using namespace std;
6
7
8 //抽象的同事类
9 class Colleage
10 {
11 private:
12 string name;
13 string content;
14 public:
15 Colleage(string n = " "):name(n){};
16 void set_name(string name)
17 {
18 this->name = name;
19 }
20 string get_name()
21 {
22 return this->name;
23 }
24 void set_content(string content)
25 {
26 this->content = content;
27 }
28 string get_content()
29 {
30 return content;
31 }
32 virtual void talk(){};
33
34 };
35 //具体的同事类:班长
36 class Monitor : public Colleage
37 {
38 public:
39 Monitor(string n = ""):Colleage(n){};
40 virtual void talk()
41 {
42 cout<<"大班长 说:"<<get_content()<<endl;
43 }
44 };
45 //具体的同事类:团支书
46 class TuanZhiShu : public Colleage
47 {
48 public:
49 TuanZhiShu(string n = ""):Colleage(n){};
50 virtual void talk()
51 {
52 cout<<"团支书 说:"<<get_content()<<endl;
53 }
54 };
55 //具体的同事类:同学A
56 class StudentA : public Colleage
57 {
58 public:
59 StudentA(string n = ""):Colleage(n){};
60 virtual void talk()
61 {
62 cout<<"学生 A 说:"<<get_content()<<endl;
63 }
64 };
65 //具体的同事类:同学B
66 class StudentB : public Colleage
67 {
68 public:
69 StudentB(string n = ""):Colleage(n){};
70 virtual void talk()
71 {
72 cout<<"学生 B 说:"<<get_content()<<endl;
73 }
74 };
75 //抽象中介者
76 class Mediator
77 {
78 public:
79 vector<Colleage*> studentList;
80 virtual void add_student(Colleage *student)
81 {
82 studentList.push_back(student);
83 };
84 virtual void notify(Colleage *student){};
85 virtual void chart(Colleage *student1,Colleage *student2){};
86 };
87 //具体中介者qq通讯平台
88 class QQMediator : public Mediator
89 {
90 public:
91 virtual void notify(Colleage *student)
92 {
93 student->talk();
94 for(int i = 0 ; i < studentList.size() ; ++i)
95 {
96 //不是说话者
97 if(student != studentList[i])
98 {
99 studentList[i]->talk();
100 }
101 }
102 };
103 virtual void chart(Colleage *student1,Colleage *student2)
104 {
105 student1->talk();
106 student2->talk();
107 }
108 };
109
110
111 int main()
112 {
113 QQMediator qq;
114 Monitor studentMonitor("Vincent");
115 TuanZhiShu studentTuanZhiShu("Robort");
116 StudentA studentA("Sam");
117 StudentB studentB("Tom");
118 /*----------------------班长发通知-----------------------------*/
119 cout<<"下面的班长发布一个通知的场景:"<<endl;
120 //将同学们加入到qq群中
121 qq.add_student(&studentMonitor);
122 qq.add_student(&studentTuanZhiShu);
123 qq.add_student(&studentA);
124 qq.add_student(&studentB);
125 //设置大家的回复信息
126 studentMonitor.set_content("明天下午2点开年级会,收到回复^^。");
127 studentTuanZhiShu.set_content("知道了,肯定到!!");
128 studentA.set_content("收到了,但是可能晚点到!!");
129 studentB.set_content("收到了,但是明天要去面试!!");
130 //开始发通知
131 qq.notify(&studentMonitor);
132 /*--------------------两个同学私下交流--------------------------*/
133 cout<<endl<<"下面是两个同学的私下交流:"<<endl;
134 studentMonitor.set_content("你觉得咱们“软件项目管理老师”讲的怎么样?");
135 studentA.set_content("我觉得讲的不够生动,还点名,不太好!!!");
136 qq.chart(&studentMonitor,&studentA);
137 return 0;
138 }

下面是运行的结果:

看看,这样就利用qq这个平台完成了同学之间的交流。并且同学之间并没有相互联系,联系都是通过qq实现的,如果现在要对象进行扩展,比如也可以通过飞信啊,只需要加入class FeiXin:public Mediator 就可以了,如果想扩展同学C只需要,class StudentC:public Colleage 即可。并且在客户端的使用也是很方便的哦~~这时回过头想一想如果不用“中介者模式”的话,系统会是什么样呢???
二、使用中介者模式的场合和优缺点
使用终结者模式的场合
1.一组定义良好的对象,现在要进行复杂的通信。
2.定制一个分布在多个类中的行为,而又不想生成太多的子类。
可以看出,中介对象主要是用来封装行为的,行为的参与者就是那些对象,但是通过中介者,这些对象不用相互知道。呵呵~~~
使用中介者模式的优点:
1.降低了系统对象之间的耦合性,使得对象易于独立的被复用。
2.提高系统的灵活性,使得系统易于扩展和维护。
使用中介者模式的缺点:
中介者模式的缺点是显而易见的,因为这个“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。
设计模式之中介者模式(Mediator)的更多相关文章
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 设计模式之中介者模式(Mediator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 大熊君说说JS与设计模式之------中介者模式Mediator
一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...
- 设计模式 笔记 中介者模式 Mediator
//---------------------------15/04/27---------------------------- //Mediator 中介者模式----对象行为型模式 /* 1:意 ...
- 行为型设计模式之中介者模式(Mediator)
结构 意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 适用性 一组对象以定义良好但是复杂的方式进行通信.产生的相互 ...
- 【设计模式】—— 中介者模式Mediator
前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用 ...
- 设计模式之中介者模式(Mediator)
中间者模者模式原理:中介者维持所有要交互对象的指针或者对象,所有对象维持一个中介者的指针或者对象. #include <iostream> #include <string> ...
- 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...
随机推荐
- Kubernetes-6:Pod生命周期介绍(init Container)
Pod生命周期 生命周期 1.API server调用kubelet下达Pod创建指令 2.容器环境初始化 3.进入Pod生命周期内(Pod开始创建) 4.Pod只要创建,就会自动生成一个pause容 ...
- Redis实战11-实现优惠券秒杀下单
本篇,咱们来实现优惠券秒杀下单功能.通过本篇学习,我们将会有如下收获: 1:优惠券领券业务逻辑: 2:分析在高并发情况下,出现超卖问题产生的原因: 3:解决超卖问题两种方案:版本号法及CAS法 4:乐 ...
- MVCC能否解决幻读?
一.什么是MVCC 多版本控制: 指的是一种提高并发的技术.最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞.引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提 ...
- 6.24Win&linux&分析后门 勒索病毒分析
操作系统应急响应 1.常见危害 暴力破解.漏洞利用.流量攻击(危害不确定) 木马控制(Webshell.PC木马等),病毒感染(挖矿.蠕虫.勒索等) 2.常见分析 计算机用户.端口.进程.启动项.计划 ...
- anaconda-navigator 卡在 loading applications
其实上学期开学就已经这样了,我又不用,再者我上课对这些依赖不大,就没管. 这几天想彻底搞定吧.现状了opencv,最后搞了半天,还是通过安装相应版本的.whl文件搞定了,无法conda install ...
- TypeScript – Decorator Metadata
前言 在 TypeScript – Decorator 装饰器 里,我有提到 TypeScript 只实现了 decorate 的特性,把 metadata 的特性独立了出来. 本来我以为还需要等待很 ...
- CSS – Sass & SCSS
前言 CSS 代码多了就不好管理了, 这是它语法先天的不足. Sass 就是加强它语法的, Sass 为 CSS 引入了一些 JS 语言的特性, 比如 variable, function, para ...
- x64汇编——汇编指令
汇编指令 mov dest, src mov move的简称 将src的内容赋值给dest,类似于dest = src [地址值] 中扩号 [ ]里面放的都是内存地址 一个变量的地址值,是它所有字节地 ...
- SpringMVC —— RESTful入门
RESTful入门案例 1.设定http请求动作(动词) @RequestMapping(value = "/users",method = RequestMethod.POS ...
- oneforall配置环境,报错cannot import name 'sre_parse' from 're' 解决方法
高版本python中re模块没有了sre_parse模块, 可以修改python中的exrex.py 代码,直接导入sre_parse模块