文档章节

设计模式之中介者模式

chenxkang
 chenxkang
发布于 2017/05/04 09:56
字数 812
阅读 20
收藏 0

       中介者模式,属于行为型设计模式,主要是用来降低多个对象与类之间的通信复杂性。

  定义:通过一个中介对象来封装一系列的对象交互,使得各个对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

  问题描述:如果在一个系统中对象之间的联系呈现为网状结构,对象之间存在大量的多对多的联系,将导致系统非常复杂,对象与对象之间互相影响,这样直接耦合的关系将会导致系统的过度耦合。

  解决方案:可以将系统的网状结构变成以中介者为中心的星形结构,让对象与对象之间不再直接联系,而是通过这个中介者对象与另一个对象发生相互作用。

  结构图

  举个例子:讲一个同事之间工作交流的故事。。。

  我们通过一个中介者来实现:1. 一个同事向另一个同事发送任务;2.一个同事向所有其他同事发送消息。

  1. 新建一个抽象中介者Mediator,它是一个抽象类。代码如下:

         

  2. 分别新建两个具体抽象中介类ConcreteMediator01和ConcreteMediator02,均继承抽象中介者类Mediator。代码如下:

  

  具体抽象中介类ConcreteMediator02雷同,略。

  3. 新建一个抽象同事类Colleague,它也是一个抽象类。代码如下:

         

  4. 分别新建三个具体同事类,均继承抽象同事类Colleague。代码如下:

         

  其他具体同事类雷同,略。

  5. 功能一:一个同事向另一个同事发送任务。代码如下:

         

  6. 功能二:一个同事向所有其他同事发送消息。代码如下:

         

  7. 运行后的效果,如图所示:

         

  综上,中介者模式将一个网状结构变成一个以中介者对象为中心的星形结构,在这个星形结构中,使用中介者对象与其他对象的一对多关系来取代原有对象之间的多对多关系。

  优点

  1. 简化了对象之间的交互。

  2. 将各个同事对象解耦,无论是改变还是新增一个同事类或中介者都比较方便。

  3. 减少子类生成,各个同事类可被重用。

  缺点:在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

  适用场景

  1. 一个对象要和很多对象进行直接的通信,导致难以复用该对象。

  2. 系统中存在对象之间的多对多的关系;

  3. 想通过一个中间类来封装多个类中的行为,而又不想生成太多子类。

© 著作权归作者所有

共有 人打赏支持
chenxkang
粉丝 1
博文 20
码字总数 19128
作品 0
杭州
程序员
私信 提问

暂无文章

Mybatis 中$与#的区别,预防SQL注入

一直没注意Mybatis 中$与#的区别,当然也是更习惯使用#,没想到避免了SQL注入,但是由于要处理项目中安全渗透的问题,不可避免的又遇到了这个问题,特此记录一下。 首先是共同点: 在mybatis...

大雁南飞了
25分钟前
0
0
Cydia的基石:MobileSubstrate

在MAC与IOS平台上,动态库的后缀一般是dylid,而加载这些动态库的程序叫做dynamic linker(dyld)。这个程序有很多的环境变量来设置程序的一些行为,最为常用的一个环境变量叫做"DYLD_INSERT_...

HeroHY
28分钟前
1
0
Spring Clould负载均衡重要组件:Ribbon中重要类的用法

Ribbon是Spring Cloud Netflix全家桶中负责负载均衡的组件,它是一组类库的集合。通过Ribbon,程序员能在不涉及到具体实现细节的基础上“透明”地用到负载均衡,而不必在项目里过多地编写实现...

Ala6
37分钟前
0
0
让 linux 删除能够进入回收站

可以参考这个贴子 https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79543316 从那个git地址 把saferm.sh下载下来 把saferm.sh复制到 /usr/bin 目录下 在用~/目下 的.bashrc 下加一句这...

shzwork
47分钟前
1
0
Qt那些事0.0.9

关于QThread,无F*k说的。文档说的差不多,更多的是看到很多人提到Qt开发者之一的“你TM的做错了(You're doing it wrong...)”,这位大哥2010年写的博客,下面评论很多,但主要还是集中在2...

Ev4n
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部