观察者模式

Java设计模式-观察者模式

梦想的初衷 提交于 2020-01-07 20:50:37
观察者模式 一、现实生活中的实例   早上起床,推开窗,看到漫天雪花,我们知道天气降温并下着大雪,于是我们穿上棉服打着雨伞出门;在过马路的时候,看到了红灯, 于是我们停下脚步等着绿灯;当穿过马路,走到公交站台看到公交车刚刚走远,于是我们摆手拦下一辆出租车坐上去上班。   从天气变化来选择出门的穿着,从交通灯的颜色变化来选择停留,从公交车远走来重新选择车子,我们总是观察者事物的变化来改变 我们的动作。 二、软件设计   从生活中的启发,我们把通过观察事物的变化来改变另一事物的行为演变成为了一种新的设计模式—观察者模式。 观察者模式的模式动机是建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。   在此,发生改变的对象称为观察目标,而被通知的对象称为观察者。   从实例中思考也可知道,多个观察者可以观察同一个对象,而且这些观察者之间没有相互联系。比如,开车的人、汽车的人、走路的 人都在看交通灯,并且都各自根据交通灯的变化而进行各自的动作。 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。   观察者模式,是一种对象行为型模式;一个观察对象的变化,其相关依赖的N个观察者都会被通知并发生相应的变化。 三、Java中的观察者模式  

观察者模式

老子叫甜甜 提交于 2020-01-07 05:36:44
一、定义: 观察者模式(Observer)又叫做发布-订阅模式(Publish/Subscribe),定义了一种一对多的依赖模式,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。 二、示例代码: package com.pattern.observer; import java.util.LinkedHashSet; /*通知类*/ public class Notified { /*用linkedHashSet防止有重复的订阅者*/ LinkedHashSet<SubscrSuper> list = new LinkedHashSet(); String message; public void addSubscription(SubscrSuper subscriber) { list.add(subscriber); } public void removeSubscription(SubscrSuper subscriber) { list.remove(subscriber); } public void setMessage(String s) { this.message = s; } public void notif() { for (SubscrSuper subscriber : list )

观察者模式(Observer Pattern)

谁说我不能喝 提交于 2020-01-02 09:30:05
动机(Motivate): 在软件构建 过程中,我们需要为某些对象建立一种“通知依赖关系” --------一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面 向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 意图(Intent): 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 -------《设计模式》GOF 结构图(Struct): 适用性: 1 .当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 2 .当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 3 .当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。 生活中的例子: 观 察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新。在ATM取款,当取款成功后,以手机、邮件等方式进行通知。 代码实现: 1 public class BankAccount 2 { 3 Emailer emailer; // 强信赖关系 4 Mobile phoneNumber

使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event

只愿长相守 提交于 2020-01-02 09:29:25
观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还有三种设备, 可以按要求展示气象站的最新数据. WeatherData的结构如下: 有3个get方法, 分别获取最新的气温, 湿度和气压. 还有一个measurementsChanged()方法, 当任一传感器有变化的时候, 这个方法都会被调用. 总结一下项目的需求: WeatherData类有三个get方法可以获取温度, 湿度和气压 如果任何一个数据发生变化, 那么measureChanged()方法就会被调用 我们需要实现这三种显示设备:   当前天气   数据统计   天气预测 系统必须可以扩展, 其他开发者可以创建自定义展示设备. 初版代码 这个地方有个"错误", xxxDisplay都是具体的实现, 而编程规则要求是应该对接口编程而不是对实现编程. 那么什么是观察者模式? 举一个例子: 报社发行报纸 你订阅报纸, 一旦有新一期的报纸发行, 新报纸就会送到你家里, 只要你一直订阅, 你就一直会收到新报纸 你不再订阅报纸的时候, 就收不到以后的新报纸了 报社运营的时候, 一直会有人去订阅或者取消订阅报纸. 发布者 + 订阅者 = 观察者模式 Publishers +

面向接口编程之三——模式研究

天大地大妈咪最大 提交于 2020-01-01 20:15:35
原文链接: http://kb.cnblogs.com/page/145705/ 通过前面两篇,我想各位朋友对“面向接口编程”的思想有了一定认识,并通过第二篇的例子,获得了一定的直观印象。但是,第二篇中的例子旨在展示面向接口编程的实现方法,比较简单,不能体现出面向接口编程的优势和这种思想的内涵。那么,这一篇作为本系列的终结篇,将通过分析几个比较有深度的模式或架构,解析隐藏其背后的面向接口思想。这篇我将要分析的分别是MVC模式和.NET平台的分层架构。   这篇的内容可能会比较抽象,望谅解。    1. 从MVC开始   MVC简介:   本文不打算详细解释MVC架构,而是把重点放在其中的面向接口思想上。所以在这里,只对MVC做一个简略的介绍。   MVC是一种用于表示层设计的复合设计模式。M、V、C分别表示模型(Model)、View(视图)、Controller(控制器)。它们的职责如下:   模型:用于存储应用中的数据及运行逻辑,是应用的实体。   视图:负责可视部分,用于与用户交互及呈现数据。视图只负责显示,不负责将用户的操作行为解释给模型。   控制器:负责将用户的行为解释给模型。根据指定的策略和用户的操作,调用模型的逻辑。   关于三者的关系,我画了一张图,大家请看:    MVC模式示意   它们之间的交互有以下几种:   1. 当用户在视图上做任何需要调用模型的操作时

RXJava

…衆ロ難τιáo~ 提交于 2020-01-01 00:36:13
Android之RxJava详解(非原创) 文章大纲 一、什么是RxJava 二、为什么要用RxJava 三、RxJava使用详解 四、项目源码下载 五、参考文章 一、什么是RxJava Rx(Reactive Extensions)是一个库,用来处理事件和异步任务,在很多语言上都有实现,RxJava是Rx在Java上的实现。简单来说,RxJava就是处理异步的一个库,最基本是基于观察者模式来实现的。通过Obserable和Observer的机制,实现所谓响应式的编程体验。 二、为什么要用RxJava 比如说一个庞大的项目,一个事件传递的整个过程可能要经历很多方法,方法套方法,每个方法的位置七零八落,一个个方法跳进去看,跳过去跳过来很容易把脑袋弄晕,不够直观。但是Rxjava可以把所有逻辑用链式加闭包的方式呈现,做了哪些操作,谁在前谁在后非常直观,逻辑清晰,维护就会非常轻松。就算不是你写的你也可以很快的了解,你可以把它看作一条河流,整个过程就是对里面的水流做进行加工。懂了这个特性我们才知道在复杂的逻辑中运用Rxjava是多么的重要。   假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders

Rxjava2(二)、五种观察者模式创建及背压

六月ゝ 毕业季﹏ 提交于 2019-12-31 12:16:08
Android进阶系列之第三方库知识点整理。 知识点总结,整理也是学习的过程,如有错误,欢迎批评指出。 上一篇: Rxjava2(一)、基础概念及使用 直接开整,上一篇基础概念里面说了, rxjava2 扩展于观察者模式,我们上篇的只是简单的介绍了用 Observable 来创建使用,其实 rxjava2 给我们提供了五种观察者模式的创建方式。 1、Observable 和 Observer 能够发射0或n个数据,并以成功或错误事件终止,在第一篇中已经举例说明了,这里就不再详细说明。 2、Flowable 和 Subscriber 能够发射0或n个数据,并以成功或错误事件终止。 支持 背压 ,可以控制数据源发射的速度。 我们看到 Observable 和 Flowable 这两个的区别就是后者支持背压,那么何为背压? 2.1、什么是背压 背压是一种现象,简单来说就是在 异步操作 中,上游发送数据速度快于下游处理数据的速度,下游来不及处理, Buffer 溢出 ,导致事件阻塞,从而引起的各种问题,比如事件丢失,OOM等。 在 rxjava1 中并不支持背压,当出现事件阻塞时候,会直接抛出 MissingBackpressureException 异常,但是在 rxjava2 中,提供了 Flowable 来创建被观察者,通过 Flowable 来处理背压问题

设计模式之观察者模式

元气小坏坏 提交于 2019-12-31 10:13:21
一、概述   观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。观察者模式有时成为发布/订阅模式,就是让多个对象在一个对象的状态改变时被通知到。 二、解决问题   当一个系统有多个类协同工作,如果在一个类中需要知道另外一个类的实现细节才能让系统运转,就会导致系统耦合过紧,以后相互依赖的类改变了或者新增了依赖的类,很多类需要同时更改。为了让交互对象之间能够松耦合,我们可以使用观察者模式。 三、结构类图 四、成员角色    抽象主题(Subject) :把所有对观察者对象的引用保存到一个集合中,每个抽象主题角色都有任何数量的观察者。抽象主题角色提供一个接口,可以增加和删除观察者。一般用一个抽象类和接口实现。    抽象观察者(Observer): 为所有具体观察者定义一个接口,在得到主题的通知时更新自己。    具体主题(ConcreteSubject): 继承抽象主题,在具体主题内部状态改变时,给所有登记过的观察者发出通知。    具体观察者(ConcreteObserver): 实现抽象观察者所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者可以保存一个指向具体主题的引用。 五、应用实例    下面是银行账号资金变动下发通知的例子,只要账号资金变动,就会同时下发app客户端消息

rxjs核心概念之Observable

为君一笑 提交于 2019-12-30 04:54:18
RxJS简介 RxJS 是基于观察者模式和迭代器模式以函数式编程思维来实现的。简单来讲RxJS的运行就是基于Observable和Observer之间的数据生产和消费的互动过程。因此,理解RxJs,首先要对Observable和Observer有深入的理解。顾名思义,Observable就是 可被观察者 ,Observer就是 观察者 ,两者通过Observable上的sunscribe方法作为桥梁将两者联系起来。 RxJS的数据流就是Observable对象,其实现了观察者模式(Observer Pattern)和迭代器模式(Iterator Pattern)这两种设计模式。 观察者模式 Observer Pattern 定义 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。----维基百科 当对象之间存在一对多的关系,就可以使用观察者模式,比如当一个对象更新时通知并更新到给多个对象。其中发布通知的是发布者,接收通知执行更新的是观察者。观察者模式属于行为模式。在RxJS中,Observable就是发布者,Observer几件事观察者,二者通过订阅subscribe进行关联。 source$就是一个Observable对象

js 设计模式:观察者和发布订阅模式

青春壹個敷衍的年華 提交于 2019-12-28 15:40:00
总是把这两个当作同一个模式,但其实是不太一样的,现在重温一下。 观察者模式 观察者直接订阅目标,当目标触发事件时,通知观察者进行更新 简单实现 class Observer { constructor(name) { this.name = name; } update() { console.log(`${this.name} update`) } } class subject { constructor() { this.subs = []; } add(observer) { this.subs.push(observer); } notify() { this.subs.forEach(item => { item.update(); }); } } const sub = new subject(); const ob1 = new Observer('ob1'); const ob2 = new Observer('ob2'); // 观察者订阅目标 sub.add(ob1); sub.add(ob2); // 目标触发事件 sub.notify(); 发布订阅模式 发布订阅模式通过一个调度中心进行处理,使得订阅者和发布者分离开来,互不干扰。 简单实现 class Event { constructor() { this.lists = new Map(); } on