观察者模式

004-行为型-03-观察者模式(Observer)

99封情书 提交于 2019-12-17 20:25:54
一、概述   当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。   定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。   Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。 1.1、适用场景   一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。   关联行为场景,建立一套触发机制 典型应用   1、侦听事件驱动程序设计中的外部事件   2、侦听/监视某个对象的状态变化   3、发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者 1.2、优缺点 优点: 观察者和被观察者之间建立一个抽象的耦合 观察者模式支持广播通信,建立一套触发机制。 缺点: 观察者之间有过多的细节依赖、提高时间消耗及程序复杂度 使用要得当,要避免循环调用 1.3、类图角色及其职责      1、Subject(被观察者)   被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。    2

Java中的观察者模式

岁酱吖の 提交于 2019-12-17 20:25:32
注:基于《Java高并发编程详解-汪文君》、《深入理解JVM高级特性与最佳实践-周志明》,以学习为目的,加上自身理解、验证。作为笔记,为加深印象,做到不复制,不粘贴。欢迎,大家一起交流学习。 观察者模式 又叫做发布-订阅模式。观察者模式定义了一种一对多的依赖关系。使得多个观察对象可以去监听到同一个主题对象,当其状态发生改变时,会通知到所有的观察者。 观察者模式的结构 1.抽象主题角色 抽象主题角色把所有的观察者的引用保存在一起,每一个主题角色都可以有任意多个观察者。抽象主题角色踢狗一个操作的接口,可以增加或者删除观察者对象。 2.具体主题角色 在观察者对象中保存与其相关的状态,当具体的主题对象内部状态发生改变时,通知到所有注册的观察者对象,进行其自身内部状态的改变。 3.抽象观察者角色 提供一个操作接口,在具体主题角色状态发生改变时,更新具体观察者的状态。 4.具体观察者角色 保存和主题的状态相关的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态协调。 观察者模式示例 public interface Observer { void process(String event); } public class ObserverImpl implements Observer { public void process(String event) {

观察者模式-C#实现

江枫思渺然 提交于 2019-12-17 20:25:16
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式有四个角色:抽象主题、具体主题、抽象观察者、具体观察者。 抽象主题:把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。 具体主题:将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。 抽象观察者:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。 具体观察者:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。 namespace DP_Observer { public abstract class Observer { public abstract void Update(); } public abstract class Subject { private List<Observer> observers = new List<Observer>(); public void Add(Observer observer) => observers.Add(observer); public void Remove(Observer observer) => observers.Remove(observer); public void Notify() { foreach

观察者模式

与世无争的帅哥 提交于 2019-12-17 20:24:26
观察者模式,又叫做发布-订阅(Publish/Subscribe)模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使得它们能够自动更新自己。 观察者模式的动机 将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不方便。而观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都可以得到通知。Subject发出通知时并不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道。而任何一个具体观察者不知道也不需要知道其他观察者的存在。 什么时候应该使用观察者模式 当一个对象的改变需要同时改变其他对象的时候。而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。也可以理解为,当一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。总的来说,观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。 工程结构 (1

观察者模式

╄→尐↘猪︶ㄣ 提交于 2019-12-17 20:24:11
1 什么时候会用到此设计模式? 1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。 1. 概述   有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 2. 解决的问题   将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。 3. 模式中的角色   3.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。   3.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。   3.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

PHP设计模式:观察者模式

谁都会走 提交于 2019-12-17 11:10:23
示例代码详见 https://github.com/52fhy/design_patterns 观察者模式 观察者模式(Observer)是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 观察者模式UML图: 观察者模式需要有4个角色: Observer观察者抽象接口,只有一个待实现方法 update() ; 具体观察者(ConcreteObserver)角色:实现了抽象接口,实际应用里可能是日志观察者、短信推送观察者等等; 主题(Subject)抽象类,用于添加观察者、触发观察者; 具体主题的实现类(ConcreteSubject),通过change触发nodifyObservers方法。实际change和nodifyObservers可以合成一个。 下面以订单为例:当状态变化,需要进行相关处理,例如写日志、短信通知。 Observer观察者抽象接口: namespace Yjc\Observer; interface IObserver { public function

11.行为型 - 观察者模式

陌路散爱 提交于 2019-12-17 08:40:43
1.定义 定义被观察者与观察者之间的一对多关系,使得Subject改变时,Observers都被通知到 使用较多,如数据库监听、发布-订阅系统 2.UML类图 角色介绍 ISubject : 抽象被观察者 ConcreteSubject : 具体被观察者 IObserver : 抽象观察者 ConcreteObserverA : 具体观察者,观察Subject的变化 ConcreteObserverB : 具体观察者 要点 被观察者持有抽象观察者的引用 3.UML示例代码 /** * Copyright (C), 2016-2020 * FileName: IObserver * Author: wei.zheng * Date: 2019/12/16 9:22 * Description: 抽象观察者接口 */ public interface IObserver { void update ( String content ) ; } /** * Copyright (C), 2016-2020 * FileName: ConcreteObserverA * Author: wei.zheng * Date: 2019/12/16 9:24 * Description: 具体观察者A */ public class ConcreteObserverA implements

Observer pattern 观察者模式

北城以北 提交于 2019-12-17 04:13:56
一、认识观察者模式 我们看看报纸和杂志的订阅是怎么回事: 1、报社的业务就是出版报纸。 2、向某家报社订阅报纸,只要他们有新的报纸出版,就会给你送来,只要你是他们的订户,你就会一直收到报纸。 3、当你不想在看到报纸的时候,取消订阅,他们就不会送新的报纸来。 4、只要报社还在运营,就会一直有人或单位向他们订阅报纸或取消订阅报纸。 出版者+订阅者=观察者模式   如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名字不太一样:出版者改称为“主题”(subject),订阅者改称为“观察者”(Observer)。 让一张图来看得仔细一定: 上图中鸭子对象不是观察者,所有在主题数据改变时不会被通知,像你没有订阅报纸业务,报社有新的报纸出版时也不会发给你报纸一样,如果鸭子对象想成为观察者就需要告诉主题,它想当一个观察者。通过注册(订阅)告诉主题。 观察者模式定义:    定义了对象之间的一对多依赖,这样一来,当一个对象改变状态使,它所有的依赖对象都会收到通知并自动更新。 松耦合:当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此之间的细节。 观察者模式提供了一种对象设计,让主题和观察者之间松耦合。 设计原则:为了交互对象之间的松耦合设计而努力。 实例代码: /** * 设计气象站 * 观察者模式: * 这是主题接口,对象使用此接口注册为观察者,或者把自己从观察者中删除

设计模式 观察者模式

这一生的挚爱 提交于 2019-12-17 00:04:38
观察者模式 一.概念: 传统理解:观察者模式(有时又被称为发布( publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是 软件设计模式 的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。 面向对象设计 的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。 观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 个人理解:观察者与被观察者的关系,可以是一对多,多个观察者。当被观察者的状态或熟悉发生变化时能及时通知所有观察者。 二.Demo: 观察者: /// <summary> /// 观察者(订阅者) /// </summary> public class Subscribe { public string

Head First设计模式之目录

不想你离开。 提交于 2019-12-16 21:57:46
一、定义 观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 观察者模式是写松耦合代码的必备模式。 二、结构 三、实现 //被观察者 public interface IObject { IList<IMonitor> ListMonitor { get; set; } //定义观察者集合,因为多个观察者观察一个对象,所以这里用集合 string SubjectState { get; set; } //被观察者的状态 void AddMonitor(IMonitor monitor); //添加一个观察者 void RemoveMonitor(IMonitor monitor); //移除一个观察者 void SendMessage(); //向所有观察者发送消息 } public class Subject : IObject { private IList<IMonitor> listMonitor = new List<IMonitor>(); public string SubjectState //被观察者的状态 {