观察者模式

设计模式总结-观察者模式

旧城冷巷雨未停 提交于 2020-01-13 01:56:05
做开发这么长时间了,设计模式用的真是不多,最近闲下来再看一遍设计模式,结合着开发经验应该可以更深层次的理解了 观察者模式 观察者模式适用于对于同一批数据需要多种展现形式的需求,也就是对象一对多的依赖形式 ,以Head First中案例:我们有一个气象局,里面有温度,湿度,气压等指标,现在我们需要三种不同的展现形式 A:展示平均温度和湿度 B:展示气压 C:展示最高温度和最高湿度 现在一旦三个指标有更新,那么ABC都得更新,我们不能直接让ABC重复的写一些获取数据的代码,这样不方便扩展代码耦合严重,也没有达到 将变化封装起来 的设计原则。所以我们需要用观察者模式:有一个主题发布者和众多的观察者,一旦主题发生了修改,观察者们就会统一进行变化(使用push数据或者pull数据的形式) 重点 封装变化 一对多的依赖关系 松耦合的设计原则(多用组合,少用继承) 源码案例 来源: CSDN 作者: han_chuang 链接: https://blog.csdn.net/han_chuang/article/details/103834297

设计模式之行为型模式(四)

风格不统一 提交于 2020-01-12 23:38:30
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式是 GoF 设计模式 中最为庞大的一类,它包含以下 11 种模式。 模板方法(Template Method)模式:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象

python-观察者模式

百般思念 提交于 2020-01-12 13:52:08
源码地址: https://github.com/weilanhanf/PythonDesignPatterns 说明: 存在这样的一种情况:公司领导再开例会那天临时有事,他让秘书给所有会上员工群发了一封邮件,通知大家会议取消,员工们收到邮件之后得知会议取消便继续回到各自岗位开始工作。这其中就包含了一种隐含地思想就是:领导与员工们之间的“一对多的通知依赖关系”。即一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变,它们之间将产生联动。 观察者模式: 定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。发生改变的对象称为观察目标,被通知的对象称为观察者 。一个观察目标可以对应多个观察者 观察者模式的结构 观察者模式包含以下4个角色: Subject(目标) ConcreteSubject(具体目标) Observer(观察者) ConcreteObserver(具体观察者) 实例: """ 在门面模式中,我们提到过火警报警器。在当时,我们关注的是通过封装减少代码重复。 而今天,我们将从业务流程的实现角度,来再次实现该火警报警器。 """ class AlarmSensor: def run(self): print("Alarm Ring...") class WaterSprinker: def run(self):

案例分析:设计模式与代码的结构特性

折月煮酒 提交于 2020-01-10 19:34:05
一、Cocoa设计模式   Cocoa环境的许多架构和机制都能够有效地使用设计模式:抽象设计可以解决特定环境中的重复问题。 本文描述了Cocoa中设计模式的主要实现,主要关注模型(Model) - 视图(View) - 控制器(Controller)和对象建模。 本章的主要目的是让您更深入地了解Cocoa的设计模式,并鼓励您在自己的软件项目中利用这些模式。 二、什么是设计模式?      设计模式是设计的模板,它可以在特定的上下文中解决一般的、重复出现的问题。它是一种抽象工具,在建筑、工程和软件开发等领域都很有用。下面的部分总结了设计模式是什么,解释了为什么它们对于面向对象设计很重要,并讨论了一个示例设计模式。 三、Cocoa如何改变设计模式      可以在OS X和iOS版本中找到适用于Cocoa的设计模式。 基于模式的机制和体系结构在Cocoa框架和Objective-C 的 runtime 和语言中很常见。Cocoa经常把自己独特的旋律放在一个模式上,因为它的设计受语言能力或现有体系结构等因素的影响。   本节包含大多数设计模式的摘要,这些设计模式是在“ 设计模式:可重用面向对象软件的元素”中编目的。 每个部分不仅总结了模式,还讨论了Cocoa的实现。 只列出Cocoa实现的模式,以下各节中的模式描述都与特定的Cocoa上下文有关。Cocoa设计模式的实现有多种形式。

8月14日至8月20日技术积累

旧城冷巷雨未停 提交于 2020-01-09 05:21:23
1)注意不同工程项目间的接口调用的方式及不同业务逻辑的使用。 2)对于Debug.Assert()的合理使用。 3)观察者与被观察者间的相互作用。 4)注意对函数方法的调用执行效率优先使用。如:itemList.Add()和itemList.Insert()的区别。 5)对于数组指针的定位使用,要清清楚楚。 6)注意区分VS集成开发环境下的Debug和Release模式异常处理响应。 7)对于问题的广度和深度,不要局限于当前解决的问题上。 8)对于业务理解的思维逻辑之严谨、合理,还要多下功夫。 9)数据结构和算法的理解与实践。 10)重构大脑固有的思维逻辑。 来源: https://www.cnblogs.com/Jashinck/p/7402874.html

js 观察者模式

纵饮孤独 提交于 2020-01-09 00:20:19
观察者模式:定义对象间 一对多 的依赖关系,当一个对象的状态发生改变,所有依赖它的对象都得到通知。 多人协作在初始化函数init()中不同人都要加事件,直接添加怕出问题,解决团队协作中多人模块间的通信问题,解耦; 使用: 1、定义一个发布者 2、定义发布者的缓存列表,存放回调函数来通知订阅者 3、遍历缓存列表,触发回调函数 发布消息 例:简单 var publisher={};publisher.receivers=[];publisher.listen=function (fn) {//增加接收者 this.receivers.push(fn)};publisher.trigger=function(){//发布消息函数 for(var i=0;i<this.receivers.length;i++){ var fn=this.receivers[i]; fn.apply(this,arguments) }};publisher.listen(function (time) {//某人接收了这个消息 console.log('正式上班时间:'+time);});publisher.trigger('2016/10',yes);//发布消息// 输出 :正式上班时间:2016/10例: var Observer=(function () { var _rank={}; return

我把RXjava的源码和这份面试都给你了,你还告诉我面不过拿不到offer?(一)

我们两清 提交于 2020-01-08 23:33:04
就在前不久做了一个关于RXJava的相关教学视频,过后整理了关于RxJava的预习资料和相关内容以及图文和相关源码,需要借鉴的可以和我联系~ 一丶 面试辅助路线(全部内容在完整的PDF里都有讲解) ( 顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找 ) https://github.com/xiangjiana/Android-MS (VX:mm14525201314) 二丶 RXJava预习: JAVA设计模式之观察者模式 1、初步认识 观察者模式的定义: 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。 大白话: 其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。 2丶这个模式的结构图 : 3、可以看到,该模式包含四个角色 抽象被观察者角色: 也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。 抽象观察者角色: 为所有的具体观察者定义一个接口,在得到主题通知时更新自己。 具体被观察者角色: 也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。 具体观察者角色: 实现抽象观察者角色所需要的更新接口

观察者+js 模式

倖福魔咒の 提交于 2020-01-08 13:28:21
<script language="JavaScript"> <!-- /*--------------------------- defined observer ----------------------------*/ function Observer()//观察者 { } Observer.prototype.update = function(context)//观察者方法 { alert(context); } function ConcreteObserver()//具体观察者 { Observer.call(this); } ConcreteObserver.prototype.update = function(context)//具体观察者方法 { alert("ConcreteObserver response " + context); } /*--------------------------- defined ObserverCollection // 观察者集合 ----------------------------*/ function ObserverCollection()// 观察者集合 { this._observers_ = new Array(); //定义数组 } ObserverCollection.prototype.add

js模式-观察者模式

流过昼夜 提交于 2020-01-08 08:13:27
// 主题,接收状态变化,触发每个观察者 class Subject { constructor() { this.state = 0 this.observers = [] } getState() { return this.state } setState(state) { this.state = state this.notifyAllObservers() } attach(observer) { this.observers.push(observer) } notifyAllObservers() { this.observers.forEach(observer => { observer.update() }) } } // 观察者,等待被触发 class Observer { constructor(name, subject) { this.name = name this.subject = subject this.subject.attach(this) } update() { console.log(`${this.name} update, state: ${this.subject.getState()}`) } } // 测试代码 let s = new Subject() let o1 = new Observer('o1', s) let

JS 观察者模式

ⅰ亾dé卋堺 提交于 2020-01-08 05:33:11
Events = function() { var listen, log, obj, one, remove, trigger, __this; obj = {}; __this = this; listen = function(key, eventfn) { //把简历扔盒子, key就是联系方式. var stack; //stack是盒子 stack = obj[key] != null ? obj[key] : obj[key] = []; return stack.push(eventfn); }; one = function(key, eventfn) { remove(key); return listen(key, eventfn); }; remove = function(key) { return obj[key] != null ? obj[key].length = 0 : void (0); }; trigger = function() { //面试官打电话通知面试者 var fn, stack, i, len, key; key = Array.prototype.shift.call(arguments); stack = obj[key] != null ? obj[key] : obj[key] = []; for (i = 0, len