观察者模式

观察者模式(python版)

筅森魡賤 提交于 2020-02-07 19:25:18
观察者模式 :又叫发布-订阅模式。 它定义了一种一对多的依赖关系,让多个观察者对象同时鉴定某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。 观察者模式所做的工作实际上就是解耦,根据“ 依赖倒转原则 ”,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。 实际场景中存在的问题 :现实中实际观察者不一定有实现观察者的通知回调方法。 解决之道: 1、为其封装一个观察类出来,实现相应的接口。 2、修改通知类,让具体观察者的Notify函数直接去调用相应的接口。 [python] view plain copy #encoding=utf-8 # #by panda #观察者模式 def printInfo(info): print unicode(info, 'utf-8' ).encode( 'gbk' ) #抽象的通知者 class Informer(): observers = [] action = '' def Attach( self , observer): self .observers.append(observer) def Notify( self ): for o in self .observers: o.Update() #秘书 class Secretary(Informer):

设计模式常见面试题汇总

北战南征 提交于 2020-02-07 14:07:54
设计模式常见面试题汇总 1.说一下设计模式?你都知道哪些? 答:设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。 **分类** **包含** **关注点** 创建型模式 工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式 关注于对象的创建,同时隐藏创建逻辑 结构型模式 适配器模式、过滤器模式、装饰模式、享元模式、代理模式、外观模式、组合模式、桥接模式 关注类和对象之间的组合 行为型模式 责任链模式、命令模式、中介者模式、观察者模式、状态模式、策略模式、模板模式、空对象模式、备忘录模式、迭代器模式、解释器模式、访问者模式 关注对象之间的通信 下面会对常用的设计模式分别做详细的说明。 2.什么是单例模式? 答:单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。 优点:不会频繁地创建和销毁对象,浪费系统资源。 使用场景:IO 、数据库连接、Redis 连接等。 单例模式代码实现: class Singleton { private static Singleton instance = new Singleton(); public

观察者模式和发布订阅模式(上)

不问归期 提交于 2020-02-07 06:56:49
观察者模式 定义:观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 其中有两个定义需要明确,被观察者和观察者。通常来说,这两者是一对多的,也有多对多的情景。 在网页开发中,被观察者通常是数据源,不论是内存数据,还是持久化数据,又或者是接口返回的数据,都可以作为被观察者。它一旦改变,就去改变依赖于它的节点。 观察者有很多可能,针对于网页开发,我们常常认为dom节点是观察者,一旦节点的监视的数据源发生变化,节点也执行更新方法。当然不限于此,也有可能是一个事件,一次计数等等。 接下来用js写一个简单的观察者模式的例子: // 发布类 class Subject { constructor (data) { this.obList = []; this.data = data; } add (ob) { if (arguments.length >= 1) { Array.from(arguments).forEach(item => this.obList.push(item)); } } remove (ob) { let i = this.obList.findIndex(ele => ele === ob); if (i >= 0) { this.obList.splice(i,

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

大憨熊 提交于 2020-02-07 06:49:21
(一)什么是观察者模式 发布-订阅,这两个词语是对观察者的最好解释,现实生活中,这样的案例有很多,比如在篮球比赛过程中教练,喊一个暂停,然后球员和裁判都做相关的响应,还有比如OA里面发布的放假通知等等。无论是篮球比赛,还是OA的通知,都存在一个角色,它的作用就是保持对相关问题的关注,在问题发生变化的时候,是Ta把消息通知给相关各方。观察者模式也差不多这样,它抽象一类对象(观察者)专门负责"盯着"目标对象,当目标对象状态有变动的时候,每个观察者就会获得通知并迅速做出响应,观察者模式解决的也是调用通知关系所带来的依赖。 上面的概念是比较官方的,我喜欢用自己的语言来讲解,比如现实生活中的,蝴蝶效应,我们程序里面的,下订单,就要发短信,减少库存呀,等等一系列的连锁反应,一句话,就是某个人发出一个行为,会引起一系列的连锁反应。 ( 二 ) 一个简单的案例 南美洲亚马孙河边热带雨林中的蝴蝶,偶尔扇几下翅膀,就有可能在两周后引起美国得克萨斯的一场龙卷风。原因在于:蝴蝶翅膀的运动,导致其身边的空气系统发生变化,并引起微弱气流的产生,而微弱气流的产生又会引起它四周空气 或其他系统产生相应变化,由此引起连锁反应,最终导致其他系统的极大变化。“蝴蝶效应”听起来有点荒诞,但说明了事物发展的结果,对初始条件具有极为敏感的依赖性;初始条件的极小偏差,将会引起结果的极大差异。这就是蝴蝶效应

23种设计模式

孤街浪徒 提交于 2020-02-06 03:04:44
1.单例模式(Singleton Pattern) 定义: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。) 通用代码:(是线程安全的) public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是static public static void doSomething(){ } } 使用场景: ● 要求生成唯一序列号的环境; ● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的; ● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源; ● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然

观察者模式学习

允我心安 提交于 2020-02-05 14:14:53
Subject(目标):目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。目标类可以是接口,也可以是抽象类或具体类。 ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的集合中或通过detach()方法将自己从目标类的集合中删除。 观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。 观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。 观察者模式满足“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。 在以下情况下可以考虑使用观察者模式: (1) 一个抽象模型有两个方面,其中一个方面依赖于另一个方面

观察者模式

本秂侑毒 提交于 2020-02-05 14:07:28
/** * 观察者模式 观察者监听事件发生者(被观察者) 如果事件发生者发生改变的话要通知所有的观察者 */ class Event extends EventGenerator { /** * eg:用户下单之后->商品库存减1->通知商家有新订单->通知快递小哥有新快递->通知客户订单已经生效 */ function tirgger() { echo "用户下单了<br />\n"; $this->notify(); } } // 事件产生者(被观察者)基类 abstract class EventGenerator { // 观察者数组 private $servers; // 增加观察者 function addObServer( Observer $server ) { $this->servers[] = $server; } // 通知观察者 function notify() { foreach ($this->servers as $server) { $server->update(); } } } // 观察者基类 interface Observer { function update(); } // 商品 class Goods implements Observer { function update() { echo "库存减1<br />\n"; }

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

删除回忆录丶 提交于 2020-02-05 13:48:16
观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 一个气象站项目 主题(可观察者) public class WeatherData implements Subject { private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList(); } @Override public void registerObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } @Override public void notifyObserver() { for(int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i

观察者模式

五迷三道 提交于 2020-02-05 13:16:19
观察者模式 1.观察者模式可以打个简单比方如:   大家看报纸,定了商报。商报是subject而订阅者是observer,当商报有新的消息的时候就出版报纸给订阅者来让他们获取消息。   也就是:定 义一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 2.UML图 3.代码说明:      Subject(主题接口): 1 public interface Subject { 2 // 添加观察者 3 public void attach(Observer observer); 4 5 // 移除观察擦着 6 public void detach(Observer observer); 7 8 void notifyObservers(); 9 }   Observer(观察者接口): 1 public interface Observer { 2 3 void update(); 4 5 }   ConcreteObserver1(观察者实例1) 1 public class ConcreteObserver1 implements Observer { 2 3 @Override 4 public void update() { 5 System.out.println("1111111111111111"); 6 } 7 8 }  

观察者模式(Observer)

社会主义新天地 提交于 2020-02-05 13:08:16
观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 UML类图: 分析: Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时,更新自己这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个 Update方法,这个方法叫做更新方法。 Subject类,可翻译为主题或者抽象通知者,一般用一个抽象类或者一个接口实现。它把所有对观察者对象的引用,保存在一个聚集里,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。 ConcreteSubject类叫做具体主题或者具体通知者,将有关状态存入具体观察者对象:在具体主题的内部状态得到改变时,给所有登记过的观察者发出通知。具体主题通常用一个具体子类实现。 ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口。以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用,具体 观察者角色通常由一个具体子类实现。 观察者模式(Observer)实现: [csharp] view plain copy print ? using System; using System