观察者模式

设计模式--观察者模式

邮差的信 提交于 2019-12-04 20:35:53
设计模式 --观察者模式 1、观察者模式 观察者模式: 定义对象间一种一对多的依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都得到通知,并被自动更新。 2、观察者模式的结构 角色 主题(Subject): 主题是一个接口,该接口规定了具体主题需要实现的方法,比如添加,删除观察者以及通知观察者的方法。 观察者(ObServer): 观察者是一个接口,该接口规定了具体观察者用来获得数据的方法。 具体主题(ConcreteSubject): 具体主题是实现主题接口的类的一个实例,该实例包含观察者关心的数据,而且这些数据可能经常发生变化。具体主题需要使用一个集合来存放观察者的引用,以便数据变化时通知具体的观察者。 具体观察者(ConreteObserver): 具体观察者是实现观察者接口的类的一个实例。具体观察者包含具体主题的引用,以便让具体主题将自己添加到具体主题的集合中,使自己成为具体主题的观察者,或者从具体主题的集合中将自己删除,不成为具体主题的观察者。 UML图    3、观察者模式举例  主题接口:Subject.java 1 package com.nick.pattern.observer; 2 3 import java.util.ArrayList; 4 5 /** 6 * @ 主题接口:定义了观察者数组(存放观察者的信息)和抽象方法 7 * @author

设计模式之观察者模式

本秂侑毒 提交于 2019-12-04 18:27:05
定义 Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每 当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。) 类图 角色 Subject 被观察者接口,定义添加观察者,减少观察者,通知观察者的方法。 ConcreateSubject 被观察者实现类,实现观察者接口的方法,在适当业务场景代码中调用notify来通知观察者。 其中notify的代码如: private List<Observer> obsList = new CopyOnWriteArrayList<>(); //通知所有观察者 public void notify(){ for(Observer o:this.obsList){ o.update(); } } Observer 观察者接口,定义收到信息后的处理方法update。 ConcreateObserver 观察者实现类,实现update方法。 高级应用 这种在JDK中已经实现了一套如java.util.Observable实现类和java.util

原生JavaScript实现观察者模式

筅森魡賤 提交于 2019-12-04 17:04:11
目录 什么是观察者模式 ES6的实现 使用set方法实现 使用Reflect和Proxy实现 总结 什么是观察者模式 维基百科 对观察者模式的定义如下: 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 说的简单些,就是在数据发生改变时,对应的处理函数自动执行。维基的定义中涉及到了主动发出通知,按照这种方式,在angularJS中的事件广播更是中规中矩,但是其缺点是代码的可维护性较差。那么如果不进行主动通知,而是在进行对象属性值设置时,调用相关的处理函数,也可达到同等效果。如下见详细代码。 #ES5下的实现 在ES5中主要是通过 Object.defineProperty 方法定义对象属性的设置和获取,并在进行设置时执行相关的处理函数,代码示例如下: // 创建对象 var targetObj = { age: 1 } // 定义值改变时的处理函数 function observer(oldVal, newVal) { // 其他处理逻辑... console.info('name属性的值从 '+ oldVal +' 改变为 ' + newVal); } // 定义name属性及其set和get方法 Object

js观察者模式(发布-订阅模式)

我们两清 提交于 2019-12-04 17:00:10
一个被观察者对象,多个观察者对象,当被观察者对象状态发生改变时,所有的观察者均得到通知。 function Event(){ this .clientList = [] } Event.prototype = { listen : function (key,fn){ if (! this .clientList[key]){ this .clientList[key] = [] } this .clientList[key].push(fn) }, trigger : function (){ // 取第一个输入参数,监听的事件名 var key = Array.prototype.shift.call(arguments) // 根据事件名,取触发函数数组 var fns = this .clientList[key] if (!fns||fns.length === 0 ){ return false } // 遍历触发函数 fns.map ((fn) => { fn.apply( this ,arguments) }) }, remove : function (key, fn) { var fns = this . clientList [ key ] if (!fns) { return false } if (!fn) { // 未传入回调函数,取消订阅 key

js设计模式5-观察者模式(发布-订阅)

送分小仙女□ 提交于 2019-12-04 16:59:39
发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 1、原生DOM事件的订阅发布者模式。 window.onload = function () { //body订阅/观察了一个‘点击’事件 document.documentElement.addEventListener('click', function () { alert(2) }, false) } 上面的代码中,我们触发body的点击事件,会弹出2。这是我们最常见的发布订阅模式 document.documentElement.addEventListener('click', function () { alert(2); }, false); document.documentElement.addEventListener('click', function () { alert(3); }, false); document.documentElement.addEventListener('click', function () { alert(4); }, false); 使用这种方式注册事件,同一个元素的多个相同的DOM事件不会被覆盖 ,都会按注册的先后顺序触发。 2、自定义的订阅发布者模式 需要具备的几个要素:   1

高阶函数

 ̄綄美尐妖づ 提交于 2019-12-04 07:18:01
定义 函数的参数是函数(回调) 函数的返回值是函数(拆分) 事务 作用是在核心方法之前和之后都扩展 注意:这里的事务是react中的概念,跟sql语句没有关系 const perform = (anyMethod, warppers) => { warppers.forEach( wrap => { wrap.initilizae(); }) anyMethod(); warppers.forEach( wrap => { wrap.close(); }) } // 输出为您好1 您好2 说话 再见1 再见2 perform(() => { console.log('说话'); }, [{ initilizae() { console.log('您好1'); }, close() { console.log('再见1'); } }, { initilizae() { console.log('您好2'); }, close() { console.log('再见2'); } } ]) call,apply,bind三者的区别 相同点都是用来改变this的指向。 不同点,call的参数是一个一个的接受,立即执行;apply是第一个是this要指向的对象,第二个对象为数组,立即执行;bind方法在IE 6-8不支持,不是立即执行,而是返回一个改变了上下文后的函数,需要主动调用。 /

初探PHP设计模式

一个人想着一个人 提交于 2019-12-04 04:46:12
设计模式不是一套具体的语言框架,是行之有效的编码规范,是 一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。合理使用设计模式将有助于初学者更加深入地理解面向对象思维。 一、三大基本模式 1、工厂模式   工厂模式分为简单工厂模式,工厂模式,抽象工厂模式,今天主要讲简单工厂模式。通过定义好的工厂方法或者类生成对象,而不是在代码中直接new 一个类来生成对象。使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数。 声明一个初始类 class DataBase { public function __construct() { echo __CLASS__; } } 创建一个工厂类,写一个工厂方法 class Factory { static function creatDataBase() { $db = new DataBase(); return $db; } } 再在需要调用初始类的php代码处使用工厂类 spl_autoload_register('autoload1'); $db = SPL\Factory::creatDataBase(); function autoload1($class) { $dir = __DIR__;

【设计模式】观察者模式

拟墨画扇 提交于 2019-12-04 04:33:57
观察者模式 2019-11-10 18:11:40 by冲冲 1、概念 多个观察者(继承同一个抽象类)只需要注册到被观察者的通知名单,被观察者如果发生改变,则会主动通知观察者。 观察者继承同一个抽象类,该抽象类定义一个反应方法,用来定义当被观察者发生改变时不同观察者的行为。同时该抽象类在构造时将被观察者注册为属性成员。 被观察者有一个通知名单(属性成员),每个观察者要主动注册到该名单,当被观察者发生改变,会调用名单上面所有观察者对象的反应方法。 观察者模式,亦称发布-订阅模式。 2、完整代码 import java.util.ArrayList; import java.util.List; class Shop { private String product; private List<Buyer> buyers;// 持有买家的引用,即通知名单 public Shop() { this.product = "无商品"; this.buyers = new ArrayList<>(); } // 为了主动通知买家,买家得来店里注册。 public void register(Buyer buyer) { this.buyers.add(buyer); } public String getProduct() { return product; } public void

观察者模式-设计模式

ⅰ亾dé卋堺 提交于 2019-12-04 04:30:00
在现实的开发中,许多的对象都不是独立存在的,其中一个对象的行为发生改变可能导致了一个或者多个其他对象的行为也会发生改变。而这对应着设计模式中--观察者模式。 一、模式的定义与特点 定义: 指多个对象存在一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象得到了通知并被自动更新。这种模式有时候也被称为发布-订阅模式、模型-视图模式,是对象行为型模式。 优点: 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。 目标与观察者之间建立了一套触发机制。 缺点: 目标与观察者之间的依赖并没有完全解除,而且还有可能出现循环引用。 当观察者对象很多,通知的发布会花费很多时间,降低程序的效率。 二、模式的结构与实现 实现观察者模式要注意具体目标与具体观察者对象之间不能直接调用,否则两者之间耦合,违反了对象的设计原则。 模式的结构 观察者模式的主要角色如下 抽象主题(subject)角色:抽象目标类,提供了用于保存观察者对象的聚集类和增加、删除观察者对象的方法还有通过所有观察者的抽象方法。 具体主题:也叫具体目标类,实现了抽象目标中的方法,当具体主题的内部发生改变时,通知所有注册过的观察者对象。 抽象观察者角色:是一个抽象类或者接口,包含了一个更新自己的抽象方法,当接到具体主题的更改通知的时候被调用。 具体观察者角色: 实现抽象观察者定义的抽象方法。 结构图 根据上面的结构图

初学设计模式之观察者模式

断了今生、忘了曾经 提交于 2019-12-04 03:42:25
观察者模式代码例子 1 //观察者模式 2 #include<iostream> 3 #include<list> 4 using namespace std; 5 6 class MasterListener 7 { 8 public: 9 virtual void OnChange() 10 { 11 }; 12 13 }; 14 15 class Student1:MasterListener 16 { 17 public: 18 void OnChange() 19 { 20 cout<<"同学A不看小说了"<<endl; 21 }; 22 }; 23 24 25 class Student2:MasterListener 26 { 27 public: 28 void OnChange() 29 { 30 cout<<"同学B不玩手机了"<<endl; 31 }; 32 }; 33 34 35 class Master 36 { 37 protected: 38 list<MasterListener*>m_list; 39 //MasterListener* m_MasterListenerPtr; 40 public: 41 void setListener(MasterListener* m_MasterListenerPtr) 42 { 43 m_list