文档章节

设计模式之中介者模式

chenxkang
 chenxkang
发布于 2017/05/04 09:56
字数 812
阅读 19
收藏 0
点赞 0
评论 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
杭州
程序员

暂无相关文章

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 32分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 36分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 41分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 42分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 53分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 今天 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 今天 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 今天 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部