Observer

观察者模式

試著忘記壹切 提交于 2020-03-17 22:59:41
某厂面试归来,发现自己落伍了!>>> 虽然,工作中不使用任何设计模式,写一个包含1000行代码的函数,并不会有什么问题。但我现在开始觉得,如果在写代码前能思考、套用一些模式的话,我们的思考会更有深度。 开发中经常会遇到的场景:在一个函数体中,我们总是需要在完成核心功能之后,再附加完成一些别的功能。 拿电子书的场景举例,在用户付款成功后,核心的操作就是:交付权益。但我们往往还会有别的附加操作,比如: 通知推荐平台,上报用户购买的数据,用于后续个性化推荐 通知结算平台、上报用户购买的数据,用于公司收支结算 很多人都习惯在函数末尾加上一堆这样的逻辑,也包括我自己。但其实,我们可以把代码写的更优雅。 观察者模式非常适合这种通知的场景,我们首先定义观察主体,它提供了3个方法,注册观察者、删除观察者、通知所有注册的观察者。 type Subject struct { List map[string]Observer } func (subject *Subject) Attach (obj Observer, identify string) { subject.List[identify] = obj } func (subject *Subject) Del ( identify string) { delete(subject.List[identify]) } // 通知所有观察者

设计模式-观察者模式

北战南征 提交于 2020-03-16 17:31:41
某厂面试归来,发现自己落伍了!>>> 观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。 我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。 AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。 Observer接口: public interface Observer { public void update(); } 两个实现类: public class Observer1 implements Observer { @Override public void update() { System.out.println("observer1 has received!"); } } public class Observer2 implements Observer { @Override

angular--Observable总结

a 夏天 提交于 2020-03-12 22:19:55
Observable的通俗理解 Observable在消息发布者和观察者Observer之间起到一个媒体中介的作用,Observer是真正需要接受信息的人。Observable的实例提供了一个订阅函数,subscribe()。当Observable的实例接收到信息时,将Observer作为参数传递给subscribe(),也就是通过subscribe()函数通知Observer,Observer接到通知后,使用next()方法再通知Observable()表示可以传数据了,然后Observer可以一直接收到数据,直到发生error(),或是数据接收完成,complete(); 创建Observable对象的几种情形 通过promise创建 import {fromPromise} from 'rxjs'; const data = fromPromise(fetch('api/endpoint')); data.subscribe({ next(response){ console.log(response); }, error(err){ console.error('Error' + err); }, complete(){ console.log('Completed'); } }); 通过counter创建 import {interval} from 'rxjs'; /

浅显易懂设计模式 · GOF设计模式分类

蓝咒 提交于 2020-03-10 19:45:48
Gof 设计模式分类 GoF设计模式可分为创建型模式、结构型模式和行为型模式 3 种。 创建型模式 :用于描述“ 怎样创建对象 ”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了 单例、原型、工厂方法、抽象工厂、建造者 等 5 种创建型模式。 结构型模式 :用于描述 如何将类或对象按某种布局组成更大的结构 ,GoF 中提供了 代理、适配器、桥接、装饰、外观、享元、组合 等 7 种结构型模式。 行为型模式 :用于 描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责 。GoF 中提供了 模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器 等 11 种行为型模式。 创建型 结构型 行为类型 应用于类 Factory Method Adapter Interpreter<br>Template Method 应用于对象 AbstractFactory <br> Builder <br> Prototype <br> Singleton Adapter <br>Bridge<br>Composite<br>Decorator<br>Facade<br>Flyweight<br>Proxy Chain of Responsibility<br>Command<br>Iterator<br>Mediator<br

前端百问

馋奶兔 提交于 2020-03-08 19:58:41
问:如何理解 html 标签语义化? html5 新出的标签,每个标签都有自己语义,什么标签做什么事。让人看的懂,也让机器可以看的懂,利于 SEO 。 问: css 权重是什么? 设置节点样式的方式有很多种,不同的方式它们的权重并不相同,当它们给一个节点设置同一个样式时,谁的权重高谁就生效。 important :无限高 行内样式:权重值为 1000 id 选择器:权重值为 100 类、伪类、属性选择器:权重值为 10 元素选择器:权重值为 1 问:盒模型有几种,它们区别是什么? 标准盒模型:设置的宽高只是包括内容区,内边距和边框另算。 怪异盒模型:设置的宽高包含了内边距和边框。 使用 box-sizing 属性设置: border-box :怪异盒模型、 content-box :标准盒模型。 问:什么是 BFC ? 块级格式上下文,一句话来说就是让块级元素有块级元素该有的样子,触发 BFC 可以清除浮动、让 margin 不重叠。 问:如何触发 BFC ? float 的值不为 none 。 overflow 的值不为 visible 。 display 的值为 table-cell 、 table-caption 和 inline-block 之一。 position 的值不为 static 或 releative 中的任何一个。 问:你常用的清除浮动方式是什么?

设计模式 一一一 策略模式

南笙酒味 提交于 2020-03-08 02:45:13
观察者模式(Observer) 概念: 又叫做发布-订阅(publish-subscribe)模式。 多个观察者同时监听某一个对象,当这个对象发生变化时,这个对象会通知所有感兴趣的观察者,以便于他们能够做出相应的处理。 jdk中的观察者模式: Observer 观察者 说明:观察(监听)着感兴趣的对象,通过将自身注册到感兴趣的对象中,并且由感兴趣的对象发通知来实现观察(监听)的效果。收到通知后,根据通知的内容做相应的处理。 Observable 被观察者 说明:维护者对自身感兴趣的观察者,并且可以将自身的情况通知给观察者。 /** * 被观察者Observable */ public class Observable { /** * 维护着注册到自身的观察者列表 */ private Vector<Observer> obs; // 观察者注册表 /** * 当自身(即被观察的对象)发送变化时,依次通知注册表中的观察者 */ public void notifyObservers() { // 说明:下面是简化后的代码,可以使逻辑看起来更清晰一些。 Object[] arrLocal = obs.toArray(); for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg

ZooKeeper系列之(十二):服务端实现机制

一世执手 提交于 2020-03-06 11:10:34
服务端有3种运行方式:leader,follower,observer。leader是领导者,一个ZooKeeper集群同一时刻最多只能有一个leader。follower是跟随者,可以有多个跟随者。Observer是观察者,也可以有多个观察者。 集群刚开始的时候没有leader,这时所有的follower会发起选举过程,选举出唯一一个leader。只有选举出了leader之后集群才能正式工作,被选举出的机器的角色则从follower转换成leader,其余的机器则将自己的leader地址更改为新选举出的leader地址。observer不参与选举过程。 正常的集群对外提供统一服务接口,不管leader、follower、还是observer都可以提供对外服务,对于客户端来说他们是没有区别的。 服务端功能可以分成两大类:选举相关的和服务相关的,我们先看服务相关的。 服务相关的专门用于响应ZooKeeper客户端的请求,类名称为ZooKeeperServer。它又分成3个子类,名称为:LeaderZooKeeperServer,FollowerZooKeeperServer,ObserverZooKeeperServer。顾名思义它们分别在Leader,Follower,Observer时使用。 当LeaderZooKeeperServer收到客户端写事务请求时

折腾Java设计模式之观察者模式

ぐ巨炮叔叔 提交于 2020-03-01 12:23:52
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in all its dependents being notified and updated automatically. 直译过来就是,定义对象间的一对多依赖关系,当一个对象的状态变更会自动通知和更新所有依赖项。像发布/订阅模式,事件通知模式,数据源/监听模式等都是性质一样。 观察者模式UML UML类和时序图 类图:Subject类不会直接更新从属对象的状态。相反,Subject引用了用于更新状态的观察者接口(update()),这使得Subject独立于依赖对象的状态更新方式。Observer1和Observer2类通过将状态与Subject的状态同步来实现Observer接口。 时序图:Observer1和Observer2对象调用Subject1上的attach(this)来注册自己。假如Subject1的状态发生变更,Subject1本身调用notify()。notify()对已注册的Observer1和Observer2对象调用update(),后者从Subject1请求已更改的数据(getState())以更新(同步)其状态。 UML类图 观察者模式角色 Subject

Java基础 -- 观察者设计模式

久未见 提交于 2020-03-01 10:47:41
由于博主最近一遍回顾基础,一遍学新的知识点,所以发表的博客文章不会是按照顺序的发表的,不过是分好类的。 一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展浩。这是我的第十一篇博客。加油!!! 今天来分享下Java基础知识 - - > 观察者设计模式!!!学习使用Java文档提供的关于观察者设计模式的一个 接口 Observer 和一个 类 Observable 。 首先简单介绍下 观察者设计模式 的基本原理: 该设计模式分两个角色,一个是观察者,一个是被观察者。 举个例子:2个狗狗( 逗逗、毛球 ) 和 他们的 铲屎官 。当 铲屎官 拿着狗粮并且命令逗逗和毛球坐好的时候,此时观察者就是逗逗和毛球(死盯着铲屎官拿着的那盘狗粮),因此被观察对象就是 狗粮。 原理大概就这样,下面上代码实验一波: 编写一个被观察者的类(这里定义 狗粮为被观察者 ): package com.java8090.Watcher; import java.util.Observable; /** * @author zhanhao * @create 2019-09-10 14:11 */ public class DogFood extends Observable { private Integer amount; public

RxJava 学习笔记<二> subject

十年热恋 提交于 2020-02-28 22:55:38
Subjects 是一个继承了 Observable 和实现 Observer 的接口,咋看之下看起来有点奇怪,但是在很多情况可以让代码写起来简单。 Subjects的实现有很多,我们可以看几个例子,了解他们的不同之处 PublishSubject PublishSubject的操作是最直截了当的,当一个值被推到 PublishSubject中,这个 subject 就会把数据给到每个 subscriber,1 没有输出是因为在他 push 的时候没有 subscribed 输出: ReplaySubject ReplaySubject有一个缓存所有推向它数据的特性,当一个新的subscription建立,时间流将会重新开始推向subscriber,之后的就像 PublishSubject 实现一样。在看ReplaySubject的第二个例子可以知道,缓存所有的不是一个好主意,这样 observable 序列会执行很长时间,我们可以使用 ReplaySubject.createWithSize 限制缓存的大小。在第三个例子中可以看出使用 ReplaySubject.createWithTime 限制缓存的时间。 输出: BehaviorSubject BehaviorSubject仅仅保留最后一个值,类似于 ReplaySubject 设置缓存一个,当创建的时候