观察者模式

Head first设计模式(2)

天涯浪子 提交于 2020-03-01 11:55:27
认识观察者模式 我们看看报纸和杂志的订阅是怎么回事: 1 、报社的业务就是出版报纸 2 、向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸 3 、当你不想再看报纸的时候,取消订阅,他们就不会再送新报纸来 4 、只要报社还在运营,就会一直有人(或单位)向他们订阅报纸或取消订阅报纸 出版者 + 订阅者 = 观察者模式 如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版者改称为“主题” (Subject) ,订阅者改称为 " 观察者 "(Observer) 1 、主题对象管理某些数据 2 、当主题内的数据改变就会通知观察者 3 、一旦数据改变,新的数据会以某种形式送到观察者手上 4 、观察者订阅(注册)主题以便在主题数据改变时能够收到更新 5 、某个对象不是观察者,所以在主题数据改变使不会被通知 观察者的一天 1 、鸭子对象过来告诉主题,它相当一个观察者 2 、鸭子其实想说的是:我对你的数据改变感兴趣,一有变化请通知我 3 、鸭子对象现在已经是正式的观察者了 4 、鸭子静候通知,等待参与这项伟大的事情。一旦接获通知,就会得到一个整数 5 、主题有了新的数据值 6 、现在鸭子和其他所有观察者都会收到通知:主题已经改变了 7 、老鼠对象要求从观察者中把自己除名 8 、老鼠已经观察此主题太久,厌倦了

PHP深入观察者模式

北城余情 提交于 2020-03-01 06:12:29
####观察者模式 设计观察者是为了让一个对象跟踪某个状态,知道状态如何改变,一旦状态改变,所有订阅的对象都能得到通知 #####使用SPL实现观察者模式 Splsubject 接口有三个抽象方法 attach(),detach(),notify()这些方法不返回任何结果 SplObserver 接口有一个方法update()它会得到subject状态的最新状态并交给观察者实例 SplObjectStorage 类描述为从对象到数据或对象集的一个映射 <?php /** * Created by PhpStorm. * User: gewenrui * Date: 16/3/14 * Time: 下午7:46 */ //继承Splsubject接口 class ConcreteSubject implements SplSubject{ private $observers; private $data; //实例化仓库 public function setObservers(){ $this->observers = new SplObjectStorage(); } //添加观察者 public function attach(\SplObserver $observer){ $this->observers->attach($observer); } //删除观察者

RxJava 简易上手指南

ぃ、小莉子 提交于 2020-02-29 21:46:32
RxJava简易上手指南 标签(空格分隔): android rxjava 作者:陈小默 版权声明:禁止商用,转载请注明出处 [toc] 本文章仅作为初学者最快上手实践,不会深入涉及代码原理,有兴趣的朋友可以参阅 扔物线-给Android开发者的RxJava详解 #一、介绍 RxJava通过扩展的观察者模式实现异步操作 Observable:被观察者 Observer:观察者 Subscriber:消息订阅者 其中的关系是观察者(Observer)或者消息订阅者(Subscriber)通过订阅(subscribe)的方式观察被观察者(Observable)的行为 #二、回调方法介绍 ##2.1 观察者对象<span id = "观察者对象"></span> //观察者对象 实现了观察者接口,其中泛型代表了观察者需要的相应对象 Observer<String> observer = new Observer<String>() { @Override public void onCompleted() { //观察任务完成时回调 } @Override public void onError(Throwable e) { //发生错误时回调,并即刻终止事件序列的传递(与onCompleted方法互斥) } @Override public void onNext(String s)

观察者模式

左心房为你撑大大i 提交于 2020-02-29 19:31:30
观察者模式为您提供了避免组件之间紧密耦合的另一种方法 这种模式是什么原理呢? 咱们需要先知道什么是观察者, 大家有玩过斗地主的吧. 没玩过也见过. 就是有的人可以参与游戏.而有的人可以在边上观战. 这种观战的人,就叫观察者. 设计模式中的观察者是什么意思呢?咱们就以实际的案例来描述这个模式 有时候,比如发广告,需要群发邮件通知一下,那怎么做呢(简单的场景,并不符合现实情况) 这时,需要写一个类(注册器,也就是被观察者)用于注册和通知功能. 另一个类(观察者)就是用来具体通知动作的类.代码如下 [PHP] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 <?php /** * 注册的注册器功能 */ class Register { public $mObList = []; //观察者列表 /** * 注册方法 */ public function registerObj( $obj ) { $this -

NSNotificationCenter

旧街凉风 提交于 2020-02-29 16:47:13
一个 NSNotificationCenter 对象(通知中心)提供了在程序中广播消息的机制,它实质上就是一个通知分发表。这个分发表负责维护为各个通知注册的观察者,并在通知到达时,去查找相应的观察者,将通知转发给他们进行处理。 本文主要了整理了一下 NSNotificationCenter 的使用及需要注意的一些问题,并提出了一些未解决的问题,希望能在此得到解答。 获取通知中心 每个程序都会有一个默认的通知中心。为此, NSNotificationCenter 提供了一个类方法来获取这个通知中心: 1 + (NSNotificationCenter *)defaultCenter 获取了这个默认的通知中心对象后,我们就可以使用它来处理通知相关的操作了,包括注册观察者,移除观察者、发送通知等。 通常如果不是出于必要,我们一般都使用这个默认的通知中心,而不自己创建维护一个通知中心。 添加观察者 如果想让对象监听某个通知,则需要在通知中心中将这个对象注册为通知的观察者。早先, NSNotificationCenter 提供了以下方法来添加观察者: 1 2 3 4 5 - (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *

Java中的Observable和Observer(观察者模式)

这一生的挚爱 提交于 2020-02-28 22:52:08
观察者模式介绍 在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。 如果画面A是显示数据库里面的数据,而画面B修改了数据库里面的数据,那么这时候画面A就要重新Load。这时候就可以用到观察者模式 以下例子演示Observable和Observer的使用 import java.util.Observable; import java.util.Observer; public class MainClass { public static void main(String[] args) { BeingWatch beingWatch = new BeingWatch(); //Observable中使用vector来管理加入的Observer对象, //而且update从最后加入的Observer对象开始 beingWatch.addObserver(new Watcher_1()); beingWatch.addObserver(new Watcher_2()); beingWatch.count(10); System.out.println("Final line in the main

如何使用 Java8 实现观察者模式?(上)

拜拜、爱过 提交于 2020-02-28 13:51:47
【编者按】本文作者是 BAE 系统公司的软件工程师 Justin Albano。在本篇文章中,作者通过在 Java8 环境下实现观察者模式的实例,进一步介绍了什么是观察者模式、专业化及其命名规则,供大家参考学习。本文系国内 ITOM 管理平台 OneAPM 工程师编译整理。 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式,是四人组(GoF,即 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides)在1994合著的《设计模式:可复用面向对象软件的基础》中提出的(详见书中293-313页)。尽管这种模式已经有相当长的历史,它仍然广泛适用于各种场景,甚至成为了标准Java库的一个组成部分。目前虽然已经有大量关于观察者模式的文章,但它们都专注于在 Java 中的实现,却忽视了开发者在Java中使用观察者模式时遇到的各种问题。 本文的写作初衷就是为了填补这一空白:本文主要介绍通过使用 Java8 架构实现观察者模式,并在此基础上进一步探讨关于经典模式的复杂问题,包括匿名内部类、lambda 表达式、线程安全以及非平凡耗时长的观察者实现。本文内容虽然并不全面,很多这种模式所涉及的复杂问题,远不是一篇文章就能说清的。但是读完本文,读者能了解什么是观察者模式,它在Java中的通用性以及如何处理在

设计模式-观察者模式

时间秒杀一切 提交于 2020-02-26 10:34:52
一、简介 观察者模式(Observer Pattern) :定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式是一种对象行为型模式。 别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 角色: Subject(目标):指被观察的对象。在目标中定义了一个观察者集合,一个目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。目标类可以是接口,也可以是抽象类或具体类。 ConcreteSubject(具体目标):具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。如果无须扩展目标类,则具体目标类可以省略。 Observer(观察者):观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。 ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致

js观察者模式发布/订阅

跟風遠走 提交于 2020-02-26 07:18:57
实习期结束,最近回到学校开始学习node.js,node果然是强大。不过在涉及到文件操作的时候,发现要大量使用异步回掉操作。 以前在写页面的时候,从没这么多异步操作,只有在使用'setInterval'和'XMLHttpRequest'时了解了一下异步编程。这次在学习node的过程中,把异步回掉算是弄清楚了。但是在编码书写代码的时候,陷入了回调金字塔(callback hell)。使用es6Promise解决了一些问题。也看到了EventProxy模块基于事件驱动的解决方案。 在使用EventProxy的过程中,有种似曾相识的感觉。有点像观察者模式发布/订阅。首先使用数组缓存订阅者订阅的消息,当订阅者订阅消息的时候,把订阅的消息push到指定消息的队列中,当发布者发布消息的时候,我们遍历执行push到指定消息队列中的回调事件。 而订阅者不需要关心发布者什么时候发布消息。 而发布者不需要关心订阅者订阅的状态。 var observer = new Observe(); var callback = function(num) { console.log("event:"+num); // 输出event:2 }; // 订阅消息 observer.listen("event1", callback); observer.listen("event2", callback); //

LiveData源码分析

你离开我真会死。 提交于 2020-02-26 07:00:23
前言 最近的项目重构中加入LiveData框架,并且小码的 T-MVVM 也是用了LiveData框架,好不好用你试试就知道(小码口头禅),对于LiveData使用的时候并未做太多的理解,于是乎翻了翻LiveData源代码,在此做下笔记, 什么是LiveData LiveData是一个数据持有类。它具有以下特点: 数据可以被观察者订阅; 能够感知组件(Fragment、Activity、Service)的生命周期; 只有在组件出于激活状态才会通知观察者有数据更新; LiveData能为我们做什么 能够保证数据和UI统一,LiveData采用了观察者模式,LiveData是被观察者,当数据有变化时会通知UI。 减少内存泄漏,LiveData能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除,当Activity停止时不会导致Crash,因为组件处于非激活状态时,不会收到LiveData中数据变化的通知。 不需要额外的手动处理来响应生命周期的变化,因为LiveData能够感知组件的生命周期,所以就完全不需要在代码中告诉LiveData组件的生命周期状态。 组件和数据相关的内容能实时更新,组件在前台的时候能够实时收到数据改变的通知,当组件从后台到前台来时,LiveData能够将最新的数据通知组件,因此保证了组件中和数据相关的内容能够实时更新。 若果横竖屏切换