zoukankan      html  css  js  c++  java
  • 设计模式之观察者

    观察者模式介绍

    观察者又名事件订阅者、监听者。

    观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察者”该对象的其他对象。

    通知

    目标:拥有一些值得关注的状态的对象。

    发布者:它要自身的状态改变通知其他对象。

    订阅者:希望关注发布者状态变化的其他对象。

    观察者模式的发布者类添加订阅机制,每个对象都能订阅或取消订阅发布者事件流。

    • 一个用于存储订阅者对象引用的列表成员变量。
    • 几个用于添加或删除该列表中订阅者的共有方法。
    • 所有订阅者都必须实现同样的接口,发布者仅通过该接口与订阅者交互。(接口中必须声明通知方法及其参数)。

    观察者模式结构

    • 1、发布者

    会向其他对象发送值得关注的事件。事件会在发布者自身状态改变或执行特定行为后发生。发布者中包含一个允许新订阅者加入或退出的机制。

    当新事件发生时,发送者会遍历订阅列表并调用订阅者对象的通知方法。

    • 2、订阅者接口

    声明了通知接口,该接口包含一个update(更新)方法。通过该方法来传递事件的详细信息,方法中可拥有多个参数。

    • 3、具体订阅者

    声明了订阅者接口,可以执行一些操作来回应发布者的通知。(所有具体订阅者都实现了同样的接口,发布者不需要与具体类相耦合)

    有时还需要一些上下文信息来处理更新信息。这块可通过参数来传递上下文。

    • 4、客户端

    分别创建发布者和订阅者,然后为订阅者注册发布者更新。

    应用场景

    1、 当一个对象状态的改变需要通知或改变其他对象,或一些被动消息接收时,可使用观察者模式。

    2、 当应用中的某些对象必须观察其他对象时。

    实现方式

    • 1、对业务进行拆分,一个为独立于其他代码的核心功能作为发布类;一个则为必须受到通知的订阅类
    • 2、声明订阅者和发布者接口,并在接口中定义一些必要的方法。
    • 3、确定存放实际订阅列表的位置并实现订阅方法。
    • 4、创建具体发布者类;在具体订阅者类中实现通知更新的方法。
    • 5、客户端必须生产所需的全部订阅者,并在相应的发布者处完成注册工作。

    满足开闭原则;可以在运行时建立对象之间的联系。

    Demo

    观察者模式提供一种作用于任何实现了订阅者接口的对象的机制,可对其事件进行订阅和取消订阅。

    阳光报社是一家在当地经营好多年的报社,以前都是报社将印刷好的报纸投放到各个报亭,供想买报纸的人进行挑选阅读,或者买报人可以直接去报社进行购买。随着科技的发展,电子邮箱越来越普及。人们可以按照自己的要求订阅和取消订阅,来查看各个报社的报纸新闻。

    这个模式正好可以用我们学习的观察者模式来实现。那么接下来就让我们看看到底如何实现报社发报,订阅的人们可以收到报纸。

    订阅者接口和实现

    订阅者接口和实现

    发布者接口和实现

    发布者接口和实现

    客户端测试

    客户端测试

    输出结果

    当发布者中的随机数为2时,A和B订阅者都收到了消息,当随机数为4时,且B取消了订阅,A和B都不满足条件,都没有收到消息。

    学习了解下来,其实观察者模式理解起来不难,很容易就可以熟悉。后面就需要大家在业务逻辑中,当遇到满足可以使用观察者模式的业务时,可以采用此模式。

    其实我感觉,这个模式叫做观察者模式不是很清晰,不能很好的表达其含义,应该叫订阅者模式。这样才能让人第一眼知道它是干什么的。

    小寄语

    人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

    原创不易,给个关注。

    我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。

    作者:阿辉
    关注我:微信扫描下面二维码,6T编程资料免费送。
    微信公众号:Andy阿辉
    写一些程序员的所思所想,希望对你有帮助。

    版权声明:本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    【Mocha.js 101】Mocha 入门指南
    CSS 中 Font-Family 中英文对照表
    Android Studio中找出不再使用的资源
    Java反射机制实战——字段篇
    python进阶——day02、03面向对象进阶
    python进阶_day01面对对象编程基础
    day05(文件配置命令和远程登录)
    day04(磁盘管理与目录介绍)
    day03(系统启动及常用的Linux命令的基本使用)
    day02(操作系统简介和Linux的安装与常用命令简介)
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/15178270.html
Copyright © 2011-2022 走看看