系统常常会出现这种情况:

每一个部分需要知道整体的状态。比如Excel中,当你修改了一个单元格的值,可能横列的sum需要改变,纵列的sum需要改变,根据这个单元格做的图需要改变,是否被修改的按钮需要激活... 如果没有一种很好的处理方式,导致的结果将是系统 highly integrated。

仔细分析,比如Excel的单元格,我们可以抽象出单元格是a source of news ,而其他部门是 receiver,接受单元格的改动的通知,然后进行自己的处理。

比如,单元格修改之后,通知计算总和的类来做相应的处理。

class Excelattr_reader :celldef initialize(value,sum)@cell = value@sum = sumenddef cell=(value)@cell = value@sum.updateend
endclass Sumdef updateputs "Got Excel Cell Changed"end
endsum = Sum.new
excel = Excel.new(10,sum)
excel.cell = 11

在这个例子上,这一切完全ok。但是唯一的缺点是,Excel和Sum之间是硬连接(hard-wired)。比如,当cell改变的时候,除了Sum类,Graph类也需要得到通知,在这个例子上,我们只能修改cell=(value)这个函数。改动量的确不是很大,不过,Excel类并没有真的改变,只是因为增加一个receiver,却需要修改source所在的类。这总是有些不太合理吧。

ok,让我们把事情做的彻底一点。

class Excel attr_reader :celldef initialize(value)@cell = value@observers = []enddef cell=(value)@cell = valuenotify_observersenddef notify_observers@observers.each do |observer|observer.updateendenddef add_observer(observer)@observers << observerenddef delete_observer(observer)@observers.delete(observer)end
endclass Sumdef updateputs "Got Excel Cell Changed"end
endsum = Sum.new
excel = Excel.new(10)
excel.add_observer(sum)
excel.cell = 11

通过这种方式,source不需要知道有多少receiver对它感兴趣,而增加一个新的receiver也只需要调用add_observer方法即可。

这样Observer模式的结构就已经展现在眼前了。

GoF把source叫为subject class,而receiver较为observers.

the Ruby standard library 提供了一个Observable module让我们可以轻松实现Observer模式。

#每天一种设计模式# 观察者模式相关推荐

  1. 简单易懂23种设计模式——观察者模式【含C++代码实例】

    23种设计模式C++实现--观察者模式 在做面向对象的软件开发时我们往往想达到更高的代码可复用性和更合理的软件颗粒度. 根据<设计模式--可复用面向对象软件的基础>所说:"你必须 ...

  2. 23种设计模式-观察者模式

    观察着模式 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本 ...

  3. 23种设计模式-观察者模式《关二爷成名后的生活》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(Liste ...

  4. 23种设计模式——观察者模式

    目录 观察者模式(Observer) 理解 UML图 优缺点 观察者模式在各语言中的支持 Java C# 实例 小丑表演 办公室摸鱼 投资者与股票 观察者模式(Observer) 本质:触发联动 目标 ...

  5. 【23种设计模式】观察者模式(Observer Pattern)

    个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客:这里是CSD ...

  6. Python七大原则,24种设计模式

    七大设计原则: 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:一个类负责一项职责.  2.里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE ...

  7. 9种设计模式在Spring中的运用,一定要非常熟练!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:iCoding91 https://blog.csdn.ne ...

  8. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  9. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

最新文章

  1. python爬取elasticsearch内容
  2. 【LeetCode笔记】198. 打家劫舍(Java、动态规划)
  3. php set medias,manage-medias.php
  4. 智能手环功能模块设计_手环也可全面屏,荣耀手环6亮点都在这儿
  5. 前端 HTML 获取自定义标签tag 的值方法
  6. SQL SERVER自带调试工具SQL Server Profiler简单用法
  7. case 日期when 范围_亚马逊运营干货:开case最全路径和各种实用链接,赶紧收藏...
  8. linux的守护进程init.d和xinetd.d
  9. yolov3模型训练——使用yolov3训练自己的模型
  10. 堆排序算法知识点总结
  11. 百度智能云在AI云服务市场四度夺魁!
  12. Kafka(zookeeper)环境配置超级详细
  13. GitHub · 如何创建文件夹
  14. AI 可以从人类思维中学习的11个启示
  15. js圆周运动动画_JavaScript动画实例:沿圆周运动的圆圈
  16. PGP加密技术应用(含安装包)
  17. Chrome浏览器最常用的快捷键
  18. 年终总结——过去已逝,未来可期不可欺
  19. 全球主要的域名争议解决机构有哪些?
  20. openEuler | 树莓派安装openEuler-Raspi

热门文章

  1. Linux那些事儿 之 戏说USB(7)不一样的core
  2. Matlab中bwmorph函数的使用
  3. SpringMVC常用Maven POM.xml依赖包片段
  4. 【说人话】真正意义上讲清楚了如何用$emit()在Vue.js的自定义组件中实现v-model=“”双向绑定
  5. 从BloomFilter到Counter BloomFilter
  6. linux进程间通信:shell管道 | 的实现
  7. nginx 启动 + uwsgi + django
  8. layui栅格布局问题
  9. spark ml中一个比较通用的transformer
  10. 忠告初学者学习Linux系统的8点建议