观察者模式

设计模式之观察者Observer

痴心易碎 提交于 2020-02-05 13:04:20
设计模式涵义   设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。 面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。 观察者 模式定义   Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.   定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知 并自动更新. uml类图 参与者 Subject(股票) 知道它的Observer,所有的Observer都可能观察此对象 提供了一个附加和分离Observer的接口 ConcreteSubject(ibm的股票) 保存Observer感兴趣的状态 当状态发生变化时.通知Observer Observer(股东) 为这些要接受通知的ConcreteObserver定义一个更新的接口 ConcreteObserver(股东) 维持对concretesubject的引用 存储状态并与Subject的状态保持一致 实现observer的更新接口以保持与Subject的状态一致 c#样例

Java设计模式-观察者模式

你。 提交于 2020-02-05 11:49:13
基本概念 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并被自己主动更新。这样的模式最经常使用在我们熟悉的事件驱动模型里面,像VC、Android界面里面的事件响应,就是基于观察者模式来实现。 观察者模式含义 以下解说一下个人对观察者模式的理解,事实上这个模式在我们平时工作中是非经常常使用的模式,可能你已经使用过,缺没有意识到。   观察者模式主要是针对一对多的数据更新。简单来说就是,系统里面某个元素更新了数据,然后有好几个元素是使用了这个元素的数据。此时更新了数据的对象,就要通知其它使用了它数据的对象,让他们都进行更新。   标准的观察者对象是一对多的关系,只是我们都知道设计模式里面是非常灵活,在我们使用的时候,常常须要进行变形。对现有的标准模式进行适当的改动来适应设计需求。   在我们实际应用中,还会遇到一对一、或者多对一的情况。一对一就是,一个目标相应一个观察者。多对一是指多个目标相应一个观察者。 类图: 实例一 该样例是这种情景:比如:老师有电话号码,学生须要知道老师的电话号码以便于在合适的时候拨打,在这种组合中,老师就是一个被观察者(Subject),学生就是须要知道信息的观察者,当老师的电话号码发生改变时,学生得到通知,并更新对应的电话记录。 Observer.java /** * Observer( 观察者,

java 观察这模式(发布订阅模式)

你离开我真会死。 提交于 2020-02-05 11:48:34
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。 抽象被观察者角色 :也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。 抽象观察者角色 :为所有的具体观察者定义一个接口,在得到主题通知时更新自己。 具体被观察者角色 :也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。 具体观察者角色 :实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。 java实现: 抽象被观察者(抽象主题):Observable.java 抽象被观察者的具体实现(主题服务):ObservableImpl.java 抽象观察者(用户(订阅者)的抽象):Observer.java 抽象观察者的具体实现(用户(订阅者)具体实现):User.java Observable.java(被订阅服务的实现) /** * @ClassName Observerable 被观察者(被订阅的对象抽象) * @Description TODO * @author jxd * @Date 2018年9月11日

观察者模式小结

与世无争的帅哥 提交于 2020-02-05 11:47:41
最近在阅读经典的著作<<head first design pattern>>中文版,觉得老外的著作真是太牛了,十分生动.先是复习了观察者模式,下面用书中 的例子小结之. 观察者模式的要点在于,有主题和观察者,主题是"一"方,观察者有很多个,是"多"方,当主题一方有变化时,会通知观察者. 书中的例子是有一个weatherdata对象,有温度,湿度,气压等参数,其中要通知三个不同的观察者,三个观察者要以不同的方式去展示这些数据. 首先是主题接口(subject.java) package headfirst.observer.weather; public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); } 这里实现了注册,移除,和通知各观察者的接口. 观察者接口: package headfirst.observer.weather; public interface Observer { public void update(float temp, float humidity, float pressure); } 观察者的显示方式接口

Observable详解

╄→尐↘猪︶ㄣ 提交于 2020-02-05 09:09:03
Observable详解 rxjs angular2 在介绍 Observable 之前,我们要先了解两个设计模式: Observer Pattern - (观察者模式) Iterator Pattern - (迭代器模式) 这两个模式是 Observable 的基础,下面我们先来介绍一下 Observer Pattern。 Observer Pattern 观察者模式定义 观察者模式 是 软件设计模式 的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 — 维基百科 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 我们可以使用日常生活中,期刊订阅的例子来形象地解释一下上面的概念。期刊订阅包含两个主要的角色:期刊出版方和订阅者,他们之间的关系如下: 期刊出版方 - 负责期刊的出版和发行工作 订阅者 - 只需执行订阅操作,新版的期刊发布后,就会主动收到通知,如果取消订阅,以后就不会再收到通知 在观察者模式中也有两个主要角色:Subject (主题) 和 Observer (观察者)

设计模式(二十二)观察者模式 C++

人走茶凉 提交于 2020-02-03 14:47:58
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当 一个对象被修改时,则会自动通知它的依赖对象 。观察者模式属于行为型模式。 观察者模式所做的内容就是解耦 应用场景之一就是数据中心和多个业务单元的分离 实现方式就是每一个观察者都要保存一个被观察者的指针。 被观察者注册观察者指针,通过操作观察者指针达到和观察者通信的目的。 #include <iostream> #include "string" #include "list" using namespace std; class Secretary; class Observer { public: virtual void update(string&) = 0; }; class PlayserObserver :public Observer//观察者 { public: PlayserObserver(Secretary *secretary) { this->m_secretary = secretary; } void update(string& action) { cout << "action:" << action << endl; } private: Secretary *m_secretary; }; class Secretary { public:

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

…衆ロ難τιáo~ 提交于 2020-02-02 01:09:16
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一 双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get; set; } //老鼠遇到的猫 //老鼠逃跑的方法 public void Run() { Console.WriteLine(MyCat.Name + "猫来了,大家快跑!!我是" + Name); //打印出信息 包含了猫的名字和老鼠本身的名字 } //带参和无参构造 public Rat() { } public Rat(string name, Cat cat) { this.Name = name; this.MyCat = cat; } } 要让猫叫的时候依次打印出老鼠的逃跑方法,需要在Cat类里添加一个存放Rat对象的集合 Cat类的代码如下 public class Cat { public string Name { get; set; } //猫的名字 List<Rat> list

两种设计模式(观察者模式与单例模式)

谁都会走 提交于 2020-01-31 04:12:57
设计模式 (Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 一、观察者模式 有时又被称为 发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者<Dependents>模式)这是软件设计模式的一种。 观察者模式(Observer)完美的将观察者和被观察的对象分离开。 此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。 (1)这通常透过呼叫各观察者所提供的方法来实现。 (2)此种模式通常被用来实作事件处理系统。 (3) 有多个观察者时,不可以依赖特定的通知次序。 (4)Swing大量使用观察者模式,许多GUI框架也是如此。 下边举例一个气象站检测天气的例子。 气象站: public class WeatherStation { private String weather; String[] weathers = {"下雨","下雪","下冰雹","出太阳"}; static List<BookWeather> list = new ArrayList<BookWeather>(); Random random = new

JavaScript-观察者模式

别说谁变了你拦得住时间么 提交于 2020-01-29 12:08:08
观察者模式 发布&订阅 一对多 示例:点好咖啡之后坐等被叫 传统 UML 类图 javascript 中的 UML 类图 应用场景 网页事件绑定 <button id="btn1"></button> <script> $("#btn1").click(function() { console.log(1); }); $("#btn1").click(function() { console.log(2); }); $("#btn1").click(function() { console.log(3); }); </script> promise function loadImg(src) { var promise = new Promise(function(reslove, reject) { var img = document.creatElement("img"); img.onload = function() { reslove(img); }; img.src = src; }); return promise; } var src = "....."; var result = loadImg(src); result .then(function(img) { console.log("img.width", img.width); return img;

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

时光怂恿深爱的人放手 提交于 2020-01-29 03:28:42
设计模式是对设计原则的具体化。用江湖话说就是武林秘籍,总结出来的一些固定套路,可以帮助有根基的程序员迅速打通任督二脉,从此做什么都特别快。常用的模式及其场景如下 C++常见设计模式——观察者模式 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都要得到通知并自动更新。 观察者模式从根本上讲必须包含两个角色:观察者和被观察对象。 被观察对象自身应该包含一个容器来存放观察者对象,当被观察者自身发生改变时通知容器内所有的观察者对象自动更新。 观察者对象可以注册到被观察者的中,完成注册后可以检测被观察者的变化,接收被观察者的通知。当然观察者也可以被注销掉,停止对被观察者的监控。 应用场景如下: a、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 b、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。 /* * 关键代码:在目标类中增加一个ArrayList来存放观察者们。 */ # include <iostream> # include <list> # include <memory> ​ using namespace std ; ​ class View ; ​ //被观察者抽象类 数据模型 class DataModel { public : virtual ~ DataModel ( ) { }