《Java设计模式及实践》—3.5 观察者模式

举报
华章计算机 发表于 2019/07/22 13:24:02 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第3章,第3.5节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

3.5 观察者模式

随着本书的进展,我们不断提到解耦的重要性。当减少依赖关系时,我们可以扩展、开发和测试不同的模块,而无须了解其他模块的实现细节,只需要知道它们实现的抽象。

尽管如此,在实践当中,模块是需要协同工作的。一个对象往往能够知道另一个对象的变化。例如在游戏中实施汽车类,汽车的引擎需要知道加速器何时改变其位置。一般的解决方案是创建一个引擎类,一直轮询检查加速器位置,看它是否已经改变。而更智能的方法是使加速器调用引擎以通知它有关更改。但如果想得到设计良好的代码,这还不够。

如果加速器(Accelerator)类保留对引擎(Engine)类的引用,当需要在屏幕上显示Accelerator的位置时会发生什么?最好的解决方案是让两者都依赖于抽象,而不是让加速器依赖于引擎。

1.目的

观察者模式使得一个对象的状态改变时,已经登记的其他对象能够观察到这一改变。

2.实现

观察者模式的类图如图3-6所示。

观察者模式依赖于以下类:

  • Subject(主题):主题通常是由类实现的可观察的接口。应通知的观察者使用attach方法注册。当它们不再需要被告知变更时,使用detach方法取消注册。

 image.png

图 3-6

  • ConcreteSubject(具体主题):具体主题是一个实现主题接口的类。它处理观察者列表并更新它们的变化。

  • Observer(观察者):观察者是一个由对象实现的接口,应该根据主题中的更改来进行更新。每个观察者都应该实现update方法,该方法通知它们新的状态变化。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。