当前位置: 首页 > news >正文

《java与模式》学习系列——调停者模式

 

一、 调停者(Mediator)模式的结构

调停者模式包装了一系列对象相互作用的方式,使得这些对象不必互相明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

在调停者模式中,所有的成员对象都可以协调工作,但是又不直接相互管理。这些对象都与一个处于中心地位的调停者对象发生紧密关系,由这个调停者对象进行协调工作。这个协调者对象叫做调停者(Mediator),而调停者所协调的成员对象称做同事(Colleague)对象。

如所下图所示:

二、 调停者模式的优点和缺点

优点

1)适当使用调停者模式可以较少使用静态的继承关系,使得具体同事类可以更加容易被复用。

2)适当使用调停者模式可以避免同事对象之间的过度耦合,使得调停类与同事类可以相对独立地演化。

3)调停者模式将多对多的相互作用转化为一对多的相互作用,使得对象之间的关系更加易于维护和理解。

4)调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

缺点

1)调停者模式降低了同事对象的复杂性,代价是增加了调停者类的复杂性。当然在很多情况下,设置一个调停者并不比不设置一个调停者更好。

2)调停者类经常充满了各个具体同事类的关系协调代码,这种代码常常是不能复用的。因此,具体同事类的复用是以调停者类的不可复用为代价的。

使用条件

调停者模式是常常被滥用的几个模式之一,在下列情况下不应当使用调停者模式。

1)不应当在责任划分混乱的时候使用

2)不应当对“数据类”和“方法类”使用

         初级设计师常常会设计出这样的一种系统:让一系列类只含有数据,另一些类只含有方法。比如,描述一个客户时,这些设计师首先设计出一个叫做客户数据的类,只含有客户数据;另外再设计一个类叫做“管理类”,含有操作客户以及此客户购买公司产品、付账的方法。管理类自然会涉及到其他的类,诸如产品数据类、订单数据类、付账数据类等。如此一来,“管理类”就变成一个操作所有的数据类的方法类,这是很没有道理的设计,但是有些设计师错误的把这叫做“调停者模式”的应用。

3)正确理解封装

封装首先是行为,以及行为所涉及的状态的封装。行为与状态是不应当分割开来的。调停者模式的用途是管理很多的对象的相互作用,以便使这些对象可以专注于自身的行为,而独立于其他的对象。

三、 调停者模式与其他模式的关系

门面模式

门面模式和调停者模式很相似,两者均用来给出一个低耦合度的系统。门面模式为一个子系统提供一个简单的接口,其中消息的传送是单方向的,因为门面模式的客户端只通过门面类向子系统发出消息,而不是相反的情况。

观察者模式

调停者模式与观察者模式是功能相类似的设计模式,它们之间是相互竞争的关系。换言之,使用了其中一者往往意味着放弃另一者。观察者模式通过引入观察者对象和主题对象来达到将通信分散化的目的;而调停者模式则封装了对象之间的通信,从而将通信集中到一个个中介对象中。

 

相关文章:

  • [hibernate]基本值类型映射之日期类型
  • 《java与模式》学习系列——建造者模式
  • 【PL/SQL练习】基本的PL/SQL语句
  • 《java与模式》学习系列——原始模型模式
  • 20145326蔡馨熠《信息安全系统设计基础》第11周学习总结
  • 《java与模式》学习系列——合成模式
  • 【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较
  • 《java与模式》学习系列——代理模式
  • 5种必知的大数据处理框架技术
  • 《java与模式》学习系列——策略模式
  • mysql:字符串转换为日期类型
  • 《java与模式》学习系列——模版方法模式
  • 《java与模式》学习系列——备忘录模式
  • 向量加减法运算及其几何意义
  • 关于 Java 中 finally 语句块的深度辨析
  • 时间复杂度分析经典问题——最大子序列和
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CentOS 7 防火墙操作
  • IP路由与转发
  • Java,console输出实时的转向GUI textbox
  • Mithril.js 入门介绍
  • pdf文件如何在线转换为jpg图片
  • V4L2视频输入框架概述
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 区块链分支循环
  • 我的业余项目总结
  • 学习JavaScript数据结构与算法 — 树
  • 延迟脚本的方式
  • ​Python 3 新特性:类型注解
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (2020)Java后端开发----(面试题和笔试题)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)fiber的基本认识
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (排序详解之 堆排序)
  • (原)本想说脏话,奈何已放下
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)3D模板阴影原理
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转载)利用webkit抓取动态网页和链接
  • (轉)JSON.stringify 语法实例讲解
  • [1127]图形打印 sdutOJ
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [C/C++]数据结构 堆的详解
  • [C++核心编程](四):类和对象——封装
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [Flexbox] Using order to rearrange flexbox children
  • [IDF]聪明的小羊
  • [LeetCode] Minimum Path Sum
  • [Linux] PXE批量装机
  • [Machine Learning][Part 7]神经网络的基本组成结构