zoukankan      html  css  js  c++  java
  • Head First 设计模式 第2章 观察者模式

    第2章、观察者模式

    1、定义:

      在对象之间定义一对多关系,当一个对象改变状态时,该对象的依赖会收到通知,并自动更新。

    2、介绍

      在介绍观察者模式之前,先来说一个日常生活中经常碰到的事(可能现在的人碰到的少了,但是老一辈人喷到的要多的多),那就是关于报纸的订阅。在报纸订阅这整个事件中牵扯到了报社、订阅者、邮递员这三个角色,我们来看一看这三个角色在事件中分别都负责什么工作。

      报社,主要工作有(1)给订阅者办理/撤销报纸订阅,(2)发行新报纸,(3)将发行的新报纸分派给邮递员

      邮递员,主要工作有(1)将新发行的报纸投递给订阅者

      订阅者,主要工作有(1)告诉报社我要[取消]订阅报纸,(2)接收投递员投递的报纸

      在这整个事件中,只要订阅者不主动取消订阅并且报社不倒闭,则订阅者就会一直收到来自报社的最新报纸,由此,我们就可以引出观察者模式:出版者(报社+投递员)+订阅者=观察者模式

      让我们用几个图来大致说一下观察者模式的应用场景:

      观察者模式类图:

      

      简单说下这个类图,左上部分是主题(也就是可观察者或者说是主题提供者[我更喜欢这么叫]),右下部分是观察者(主题订阅者)。其中Subject接口是主题提供者接口,所有的主题提供者都必须实现该接口,WeatherData是一个具体的主题提供者;Observer接口是主题订阅者接口,所有的订阅者都必须实现该接口,DisplayElement接口是一个用于展现的接口,想要该功能的订阅者也要实现该接口(本例中都实现了该接口)。

      接下来简单说一下实现过程,代码我会付到文章结尾供大家下载参考。

        A、WeatherData实现Subject接口;

        B、订阅者类实现Observer接口;

        C、将主题提供者(Subject)作为订阅者(Observer)的一个属性,在订阅者实例化时,自动注册[调用registerObserver()方法]到主题提供者内;

        D、当主题提供者Subject)内的信息发生变化时,自动调用measurementChanged()方法将通知推送[调用notifyObverser()方法]给订阅者(Observer);

        E、订阅者获取最新的信息并更新[调用update()方法]本地信息

    3、本章要点

      Ж 观察者定义:定义了一对多关系,当一个对象改变状态时,该对象的依赖会收到通知,并自动更新。

      Ж 新设计原则:为交互对象之间的松耦合设计而努力 

      Ж 主题(也就是可观察者)用一个共同的接口来更新观察者

      Ж 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的具体细节,只知道观察者实现了观察者接口

      Ж 使用此模式时,观察者可以从被观察者处推(push)或者拉(pull)数据(然而,推的方式被认为更“正确”)

      Ж 有多个观察者时,不可依赖特定的通知顺序

      Ж Java有多种观察模式的实现,包括了通用的java.util.Observable。要明确使用java.util.Observable可能带来的问题,如果有必要可以自己实现观察者模式,这并不难

      

    关于第2章 观察者模式模式就介绍到这里,如果以上内容有出错的地方,还请不吝赐教;如果大家觉得有讲的不明白地方,也可提出来,大家共同学习。

    第3章的装饰者模式会在最近几天更新....

     

    转载请注明出处,谢谢!

  • 相关阅读:
    Python的未来发展方向
    loadrunner分析之网页、网络、资源分析
    Django框架Day2之Template
    Django框架Day3之Models
    Appium 常用的API函数
    Django框架Day1之url和views
    Loadrunner常用分析点
    WEB性能测试用例设计
    python之高阶函数map()和reduce()
    python csv文件打开错误:_csv.Error: line contains NULL byte
  • 原文地址:https://www.cnblogs.com/edi-kai/p/4711152.html
Copyright © 2011-2022 走看看