观察者模式

C++设计模式——观察者模式

拜拜、爱过 提交于 2020-01-26 00:33:42
观察者模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。 再说说上面的数据和图之间的关系;不管是折线图、饼状图,还是柱状图,它们都依赖于数据;当数据发生变化时,数据对象会通知依赖于它的对象去更新;所以就有了Excel中,当数据发生变化时,对应的统计图也会自动的重绘。 UML类图 Subject(目标) ——目标知道它的观察者。可以有任意多个观察者观察同一个目标; ——提供注册和删除观察者对象的接口。 Observer(观察者) ——为那些在目标发生改变时需获得通知的对象定义一个更新接口。 ConcreteSubject(具体目标) ——将有关状态存入各ConcreteObserver对象; ——当它的状态发生改变时,向它的各个观察者发出通知。 ConcreteObserver(具体观察者) ——维护一个指向ConcreteSubject对象的引用; ——存储有关状态,这些状态应与目标的状态保持一致; ——实现Observer的更新接口以使自身状态与目标的状态保持一致。

Java对观察者模式的支持

一个人想着一个人 提交于 2020-01-22 10:21:57
Java中内置了观察者模式的相关类与接口,分别是Observable类以及Observer接口,其中Observable实现了对Observer的增删以及通知等功能,而Observer提供了更新的接口 public interface Observer { void update(Observable o, Object arg); } Observable类通知方法如下 public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); } Observable将存储的观察者接口转换为局部变量,以降低锁的粒度 来源: https://www.cnblogs.com/yytxdy/p/12227962.html

Python观察者模式

☆樱花仙子☆ 提交于 2020-01-20 16:21:35
关于Python观察者模式的理解 概念模糊,代码比较清晰 #对于被观察者要调用观察者的接口 #有如下表达方法 if a : a . fun ( ) elif b : b . fun ( ) #如果有新的观察者,你就得继续添加elif #于是就总结出了观察者模式 def fun ( observer ) : observer . fun ( ) #这样就不必考虑观察者是谁,而只需要关注于调用的方法是什么了 来源: CSDN 作者: 枫·羽 链接: https://blog.csdn.net/qq_38383364/article/details/104050811

观察者模式实现方法

家住魔仙堡 提交于 2020-01-20 13:51:17
class Program { static void Main(string[] args) { BankAccount account = new BankAccount(); account.name = "aladdin"; account.money = 200; account.AddInfo(new Mobile()); account.AddInfo(new Email()); account.WithDraw(100); Console.Read(); } } abstract class ISubject { ArrayList arrs = new ArrayList(); public void AddInfo(IUpdate update) { this.arrs.Add(update); } public void Notify(string info) { //取完之后要通知各组件对象 foreach (IUpdate i in arrs) { i.Update(info); } } } //银行帐户 class BankAccount : ISubject { public string name; public int money; //取钱 public void WithDraw(int money) { this.money -= money

观察者模式

浪尽此生 提交于 2020-01-18 00:05:06
个人博客 http://www.milovetingting.cn 观察者模式 模式介绍 观察者模式是一个使用率非常高的模式。它最常用的地方是GUI系统,订阅-发布系统。 模式定义 定义对象间一种一对多的依赖关系,使得每当一个对象改变时,所有依赖它的对象得到通知并被自动更新。 使用场景 关联行为场景 事件多级触发场景 跨系统的消息交换场景,如消息队列、事件总线的处理机制 简单实现 定义被观察者 public class ObservableImpl extends Observable { public void notifyChanged() { // 标识状态或者内容发生改变 setChanged(); // 通知所有观察者 notifyObservers(); } } 定义观察者 public class ObserverImpl implements Observer { private String name; public ObserverImpl(String name) { super(); this.name = name; } @Override public void update(Observable arg0, Object arg1) { System.out.println(name + ":收到更新通知"); } } 调用 public static

Java 设计模式 2 —— 观察者模式

人盡茶涼 提交于 2020-01-17 17:14:59
观察者模式 定义 建立了对象之间一对多的依赖关系,这样一来,当一个对象的状态改变时,它的所有依赖者都会收到通知并自动更新。 观察者模式中,被观察对象状态发生改变时,会通知所有的观察者。这里又有PUSH和PULL的两种模式。PUSH是被观察对象主动将内容更新到观察者之上,而PULL则是观察者主动向被观察对象获取更新内容。 观察者模式经常出现在Java的GUI、Web和Spring等地方。 UML类图 在Java的java.util包中其实已经包含了观察者模式设计的一些最基本的东西:Observable类和Observer接口。但是Observable类和Observer接口在Java9之后就被注释为Deprecated。 Observable类可以认为是“可以被观察”的一类事物,其中changed是一个boolean类型的成员变量表示该事物是否发生了改变,obs中维护了一个有观察者组成的Vector列表。其中起重要作用的是setChanged()方法和notifyObservers()方法。 public void notifyObservers ( Object arg ) { //临时对象数组,存储观察者 Object [ ] arrLocal ; synchronized ( this ) { if ( ! changed ) return ; arrLocal = obs .

设计模式之观察者模式

时光毁灭记忆、已成空白 提交于 2020-01-17 05:59:57
设计模式之观察者模式 用过微信公众号的人都知道,当发布者发布一篇推文的时候,所有订阅者都会接收到订阅消息。基于这个应用场景,我们今天来聊聊设计模式中的 观察者模式 。 介绍   观察者模式(也称发布-订阅模式)是一种行为型设计模式。该模式定义了一对多的依赖关系,发布者为一,订阅者为多。当发布者有消息改变时会推送更新数据,订阅者作为观察者感知消息的改变并实时改变自己的消息集。 观察者模式UML类图 在观察者模式中有如下角色: Subject :抽象主题,为具体主题定义接口规范,每个主题都可以有任意数量的观察者,抽象主题提供了一个接口,可以增加和删除观察者对象。 WeatherData :具体主题,实现抽象主题方法。其中该主题类聚合了观察者。在抽象主题内部有数据变化时会分别为注册过的观察者推送更新数据。 Observer :抽象观察者,为具体观察者定义了操作接口规范,其中一个最重要的方法就是更新数据的方法(update)。使得当主题发生更新变化时更新自己。 CurrentCondition :具体观察者,实现抽象观察者的接口规范。 观察者模式的简单代码实现 抽象主题接口(Subject): 1 package com.atguigu.look; 2 3 public interface Subject { 4 5 /** 6 * 注册接口 7 */ 8 void

设计模式之行为型模式

↘锁芯ラ 提交于 2020-01-15 14:31:50
1、观察者模式: /** * 抽象观察目标 */ public abstract class Subject { protected ArrayList<Observer> observers=new ArrayList<>();//定义一个观察者集合用于存储所有观察对象 //注册方法,用于向观察者集合中添加一个观察者 public void attach(Observer observer){ observers.add(observer); } //注销方法,用于在观察者集合中删除一个观察者 public void detach(Observer observer){ observers.remove(observer); } //抽象通知方法 public abstract void notifyObserver(); } /** * 具体观察目标 */ public class ConcreteSubject extends Subject { //通知所有观察者 @Override public void notifyObserver(){ for(Object obs:observers){ ((Observer)obs).update(); } } } /** * 抽象观察者 */ public interface Observer { void update();/

观察者模式实践-实现winform 窗体之间传值(事件实现)

亡梦爱人 提交于 2020-01-14 09:54:37
事件本身就是观察者模式的一个实现。 先总结一下事件的使用: 委托类型声明 定义发布者类,并声明事件 在发布者类中定义触发事件方法 定义订阅者类,并注册事件 在订阅者类中定义事件处理方法 针对事件,.Net Framework提供了一个标准模式,主要在winform中比较常见,区别就是不用自定义委托,使用EventHander委托,因此其步骤是: 定义发布者类,并声明事件 在发布者类中定义触发事件方法 定义订阅者类,并注册事件 在订阅者类中定义事件处理方法 上述步骤是在委托方法中不传参的情况,如果需要传递参数,则需要自定义EventHander中的EventArgs对象,并使用泛型委托EventHander,其步骤是: 定义类,继承自EventArgs,目的是为了加属性传参 定义发布者类: 事件的定义,使用自定义类的EventHander泛型委托 在发布者类中定义 触发事件的方法,在这个方法中填充需要传递的参数,给1中自定义类的属性赋值 定义订阅者类: 订阅事件 订阅者: 事件处理的方法,使用委托传过来的参数(继承自EventArgs类的属性) 使用事件实现winform窗体传值感觉比使用简单方法,在发布者类中维护订阅者类列表要简单一点; 而且后期扩展要更容易。 实例:本实例定义一个winform程序,有三个窗体,实现frmMain中的textbox更新内容

观察者模式详解

↘锁芯ラ 提交于 2020-01-13 07:05:58
在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。 在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来实现就非常方便。 模式的定义与特点 观察者(Observer)模式 的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。 观察者模式是一种对象行为型模式,其主要优点如下。 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。 目标与观察者之间建立了一套触发机制。 它的主要缺点如下。 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。 模式的结构与实现 实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来