文档章节

设计模式之观察者模式(三)

o
 osc_w9s1w4o0
发布于 2019/04/01 18:20
字数 1555
阅读 7
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

又和大家见面了。首先,和大家说声抱歉,之前的几篇文章,可能条理清晰之类的做的不太好,每篇文章的篇幅也比较长,小编在收到读者的建议之后, 也是认真的思考了一番。之前的想法是尽量把一个模块介绍完,没想到一个模块写着写着就写长了。在之后的文章里,需要认真分段,做到能简洁就简洁,能分块就分块,在利用大家碎片化的时间里,力争短小精悍又能收获颇丰。

之前的观察者模式,介绍了自己动手编写一套观察者模式,以及使用Java内置的观察者模式来进行实现。分了两篇,并且知道了,观察者模式是基于发布和订阅的,主要由两种模式

  • 拉模式 目标角色发生变化之后,仅仅告诉观察者角色已经发生变化了;观察者角色如果想要知道更详细的内容以及变化细节,就需要自己去获取,比如通过getter方法。
  • 推模式 通知你发生变化的同时,把变化的信息发送到观察者角色中去。推模式就是无论观察者是否需要这个信息,都会无条件的收到。

这两种模式的使用,取决于功能需求。如果目标角色错综复杂,并且观察者角色进行更新时必须得到一些具体变化的信息,那就适合用“推”;如果目标角色简单,又不需要每次都获取变化信息,那就用“拉”。

在JDK中,也有观察者模式的实际使用场景。比如Swing API的JButton。JButton的超类AbstractButton中有许多增加和删除(listener)的方法,其实就是观察者模式的提现。考虑到现在Swing的实际使用场景并不多,在这里就不进行赘述啦,感兴趣的朋友可以看看Java源代码,或者去实践下。

设计箱内的工具

这个工具其实在之前策略模式的时候总结过,但是并没有通过标题的方式单独给大家介绍,在之后的总结里,把这个单独加上,这个还是比较重要的。我们通过一步一步的学习,积累一个个工具,设计模式就不会很难啦。

  • OO基础

    抽象、封装、继承、多态

  • OO原则

    封装变化

    多用组合,少用继承

    针对接口编程,不针对实现编程

    为交互对象之间的松耦合设计而努力(这是本次的新原则。松耦合设计更有弹性,更能应对变化)

  • OO模式

    『策略模式』

    观察者模式』--在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象就会收到通知,并自动更新。(就是我们新学习的模式,以松耦合方式在系列对象之间沟通状态。MVC是观察者模式的代表,后续会有机会介绍的哦)

挑战设计原则

这次也涉及到了设计原则,之前没有过多的介绍。那么,观察者模式是如何遵循设计原则的呢?别急,马上给你

  • 找出程序中会变化的方面,然后将其和固定不变的方面相分离

在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规划!

  • 针对接口编程,不针对实现编程

主题与观察者都是用接口;观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点

  • 多用组合,少用继承

观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。

至此,小编就学完了观察者模式。相比较于书本,小编把观察者模式的其中一些更好的概念理解缩减了,只单独举了一个报社订阅报纸的例子来做进一步的解释。以及模式中的“推”和“拉”是如何引出而来的,也没有细说,在这节里把推和拉的特点进行了描述,并给出了一点拙见。

有留言给小编说图的来源,以及是否需要有画图的能力。我把我在知识星球里的回答放出来,只是自己的一点感悟,如有不对的地方,可以留言给小编修正。『设计模式归根到底还是需要一个思想,画UML图是为了更加深刻理解软件工程中的知识。优秀的写代码的程序员不一定能画好UML图,能画好UML的一定是个优秀的程序员(我是这么理解的),很多公司都不需要画图,因为只要实现功能即可,这个能力,需要自己平时培养的。我画UML图也不太好,还停留在大学老师教育的阶段,所以跟着这个学习,画图理解能力还提升了,也是另一种收获吧。类图、时序图、用例图都是比较重要的,掌握了能加深对软件工程的理解

观察者模式就到这里为止了。下一模式是装饰者模式,就如开头所说,小编会用心分块,力争短小精悍,让各位的碎片化时间得到更充分的利用。

推荐阅读

GitHub地址 HeadFirstDesign

设计模式之观察者模式(一)

设计模式之观察者模式(二)

<center>爱生活,爱学习,爱感悟,爱挨踢</center>

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
设计模式视频教程来啦

这是尚学堂科技出的一套关于Java设计模式的视频教程,其实设计模式并不是Java所特有,任何语言都可以根据其原理设计出相应的设计模式来。在设计模式领域有一句话:尽信设计模式不如不信设计模...

storezhang
2013/10/26
297
0
白话设计模式_Index

白话设计模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式(Singleton) 【白话...

浮躁的码农
2017/11/01
42
0
设计模式--刘伟(转)

原文:https://blog.csdn.net/lovelion/article/details/17517213 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多篇与设计模式学习相关的文章,涵盖了七个面向对象设计原则和24个设计...

osc_k5ta3dng
2018/05/16
5
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
244
0
设计模式学习目录,仿佛看见了一道光给作者点赞666

史上最全设计模式导学目录(完整版) 原创 2013年12月24日 23:15:16 标签: 软件工程 / 设计模式 / 博客 / 软件开发 190146 圣诞献礼! 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100...

osc_iiheq33y
2018/01/16
25
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过日期属性对数组进行排序 - How to sort an array by a date property

问题: Say I have an array of a few objects: 说我有一些对象的数组: var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}]; How can I sort......

javail
51分钟前
22
0
技术教程| 百度鹰眼历史轨迹查询:轨迹抽稀功能

本文作者:用****9 本篇教程中,我们将详细地说明鹰眼历史轨迹查询(gettrack接口)中,如何通过vacuate_grade选项对轨迹进行抽稀,以及不同的抽稀力度对轨迹产生的影响。 上一篇教程中,我们...

百度开发者中心
前天
17
0
整数的最大值和最小值 - Maximum and Minimum values for ints

问题: I am looking for minimum and maximum values for integers in python. 我在python中寻找整数的最小值和最大值。 For eg., in Java, we have Integer.MIN_VALUE and Integer.MAX_VA......

法国红酒甜
今天
22
0
Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
今天
4
0
PHP解析/语法错误; 以及如何解决它们? - PHP parse/syntax errors; and how to solve them?

问题: Everyone runs into syntax errors. 每个人都遇到语法错误。 Even experienced programmers make typos. 即使是经验丰富的程序员也会打错字。 For newcomers, it's just part of the......

fyin1314
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部