Observer

趣谈设计模式 | 观察者模式(Observer) :消息的发布与订阅

故事扮演 提交于 2020-11-01 04:00:32
文章目录 案例:文章推送 观察者模式 观察者模式的运作流程 观察者模式解决的问题 观察者模式大显身手 总结 要点 应用场景 生产者-消费者模型 VS 观察者模式 完整代码及文档 案例:文章推送 假设我是一个科幻小说爱好者,我维护着一个叫做ScienceFictionPusher的公众号,定期向豆瓣、知乎等平台推送那些我觉得有趣的科幻小说,于是为了方便管理,我的推送程序是这样的逻辑 class ScienceFictionPusher { public : //推送内容 void newPush ( ) { //分别向各大平台推送内容 _zhihu - > update ( _url , _title , _desc ) ; _douban - > update ( _url , _title , _desc ) ; } //设置新的内容 void setNewFiction ( const std :: string & url , const std :: string & title , const std :: string & desc ) { _url = url ; _title = title ; - _desc = desc ; newPush ( ) ; } private : std :: string _url ; //小说链接 std :: string

Spring的事件监听机制

此生再无相见时 提交于 2020-10-28 18:07:44
最近公司在重构广告系统,其中核心的打包功能由广告系统调用,即对apk打包的调用和打包完成之后的回调,需要提供相应的接口给广告系统。因此,为了将apk打包的核心流程和对接广告系统的业务解耦,利用了spring的事件监听特性来满足需求。以下说明spring的事件机制的相关内容。 1.观察者模式 Spring的事件监听(也称事件驱动)是观察者模式的一种实现,比较常见的有发布-订阅模型。通常我们利用消息队列来实现不同系统之间的解耦,如用户注册完成后,可以向消息队列发布一条消息,然后订阅了此topic的子系统(如邮件服务,积分服务)收到发布的消息之后,就会做相应的处理。这样做的好处是避免了在注册服务里耦合其他服务的代码,并且,执行子系统的业务将会异步执行,互不影响。下图是一个经典的观察者模式的结构。 以下为上述观察者模式的java简单实现: (1)Subject.java 1 package observerPattern; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * Created by jy on 2018/11/28. 8 */ 9 public abstract class Subject { 10 11 // 维护一个所有观察者集合 12 private List<Observer>

java设计模式

走远了吗. 提交于 2020-10-27 19:32:47
设计模式简介 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式的类型 总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns) 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 - 工厂模式(Factory Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 建造者模式(Builder Pattern) - 原型模式(Prototype Pattern) 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 过滤器模式(Filter、Criteria Pattern) -

深入剖析vue原理以及MVVM响应式原理的实现

孤人 提交于 2020-10-21 04:34:28
深入剖析vue原理以及MVVM响应式原理的实现 一、什么是MVVM 二、几种实现双向绑定的做法 一、实现数据绑定的做法有大致如下几种: 一、发布者-订阅者模式 二、脏值检查 三、数据劫持 三、vue.js数据劫持实现 一、思路整理 二、指令解析器Compile的实现 二、实现数据监听器Observer 三、实现数据订阅者Watcher 四、双向数据绑定 五、实现Proxy代理 四、总结 一、效果 二、总结 本文所有代码实现都收录于我的github, 感兴趣的可以点击访问 。 一、什么是MVVM 大家都知道vue.js遵循的是mvvm的设计理念,下面简要说明什么是mvvm。 采用分而治之思想,把不同的代码放到不同的模块当中,然后通过特定的逻辑联系到一起。 1、M:model、就是模型数据,普通的JS对象。 2、V:view、就是Dom。 3、VM:view-model、就是Vue,view和model不可以直接交互,需要通过VM联系到一起。 M 到 V(数据驱动视图):Data Bindings:通过数据绑定联系到一起。 V 到 M(视图影响数据):Dom Listeners:通过事件监听联系到一起。 只要数据进行了改变,同时视图也会同时更新。 理解了基本思想之后,我们要做什么才能实现VM呢? 1.首先,需要利用Object.defineProperty,将要观察的对象

2020-07-24:聊一下zookeeper的同步算法。

与世无争的帅哥 提交于 2020-10-14 04:14:17
福哥答案2020-07-24: 同步算法基于 ZAB 协议,一种快速 Paxos 算法。 快速Paxos算法 Paxos算法可能出现死循环,就是在两个Proposer总是在交替prepare。并且,Paxos算法在出现竞争的情况下,其收敛速度很慢,甚至可能出现活锁的情况,例如当有三个及三个以上的proposer在发送prepare请求后,很难有一个proposer收到半数以上的回复而不断地执行prepare。因此,为了避免竞争,加快收敛的速度,在算法中引入了一个Leader这个角色,在正常情况下同时应该最多只能有一个参与者扮演Leader角色,而其它的参与者则扮演Acceptor的角色,同时所有的人又都扮演Learner的角色。 在这种优化算法中,只有Leader可以提出议案,从而避免了竞争使得算法能够快速地收敛而趋于一致,此时的paxos算法在本质上就退变为两阶段提交协议。但在异常情况下,系统可能会出现多Leader的情况,但这并不会破坏算法对一致性的保证,此时多个Leader都可以提出自己的提案,优化的算法就退化成了原始的paxos算法。 一个Leader的工作流程主要有分为三个阶段: (1)学习阶段 向其它的参与者学习自己不知道的数据(决议);当一个参与者成为了Leader之后,它应该需要知道绝大多数的paxos实例,因此就会马上启动一个主动学习的过程

如何理解这6种常见设计模式?

别等时光非礼了梦想. 提交于 2020-10-11 10:40:27
简介: 设计模式能够帮助我们优化代码结构,让代码更优雅灵活。有哪些常见的设计模式?如何合理运用?本文分享作者对工厂模式、单例模式、装饰模式、策略模式、代理模式和观察者模式的理解,介绍每种模式的模式结构、优缺点、适用场景、注意实现及代码实现。 一 前言 最近在改造一些历史的代码,发现一个很明显的特点,大部分代码是记叙文,按照事件的发展过程将故事平铺直叙的讲解出来。 这种方式的好处是比较符合人类的思维习惯,一条主线讲到底,代码阅读起来没有太大难度,只要顺着藤就能摸到瓜,但是缺点也很明显,一旦故事线中需要插入一些新的元素,比如:加入一个新的人物角色、新的时间线,都会需要大量更改故事线以配合这个新元素的融入,甚至对原有文章造成破坏性的影响。 为了解决这个问题,人们总结出了很多种文章结构,例如:总-分结构,并列结构,总-分-总结构等等,有了这些结构,在加入新元素的时候,甚至不必考虑新元素与原故事情节的关联性,直接单拉一个分支故事线独立去讲就好了,只要能够在整体故事结束前,与汇聚到主线故事就可以了(是不是很像git?)。 在软件开发领域,也有很多这样的非常有用的实践总结,我们称之为设计模式。对于设计模式,大家都不陌生,随便找个人,估计都能讲出N个设计模式来,但是除了这些设计模式的概念,很多人不知道如何灵活运用这些设计模式。所以借这篇文章和大家共同学习设计模式的思想。 二 理解设计模式

清华毕业大佬带你深入研磨并掌握23种设计模式,总计6.17G,夯实你的开发基础

泄露秘密 提交于 2020-10-08 09:41:58
前言 软件开发越来越复杂,对软件设计的要求也越来越高,而软件设计和架构的入门功夫就是深入理解和掌握设计模式。因此,设计模式的重要性不言而喻。 很多朋友认识到了设计模式的重要性,也看了很多的书籍和资料,但是,常听到这样的抱怨:“ 设计模式的书我看了不少,觉得都看懂了,就是不知道在实际开发中怎么运用这些设计模式”,从而认为设计模式是"看上去很美的花拳绣腿”。 其实不然,造成这种情况的原因就在于:这些朋友对设计模式的理解不到位,自己感觉懂了,其实还差很远,并没有“真正”理解和掌握设计模式。 本文就针对这种情况,让大家真正理解和掌握23种设计模式,并且能够灵活运用,希望大家能够喜欢!!! 目录 主要内容 第1章设计模式基础, 什么是模式?从字面上理解,模,就是模型、模板的意思:式,就是方式、方法的意思。综合起来,所谓模式就是:可以作为模型或模板的方式或方法。再简单点说就是可以用来作为样板的方式或方法,类似于大家所熟悉的范例。 按照上面的理解,设计模式指的就是设计方面的模板,也即设计方面的方式或方法。 设计模式:是指在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。 第2章简单工厂,简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以需要好好掌握它,就当是学习设计模式的热身运动吧。为了保持一致性,我们尽量按照学习其他模式的步骤来进行学习。

前端面试题整理(VUE篇)

ぐ巨炮叔叔 提交于 2020-10-05 19:22:30
前端面试题整理(VUE篇) 前端面试题整理(VUE篇) MVVM模式的理解 VUE双向绑定原理 生命周期 v-model VUE初始化闪动 watch和computed的优缺点与区别 VUE通信 Vue性能优化方法 VUE-Router hash模式 history模式 VUEX VUE nextTick 虚拟DOM和Diff算法原理 MVVM模式的理解 MVVM 是 Model-View-ViewModel 的缩写。 Model代表 数据模型 ,也可以在Model中定义数据修改和操作的业务逻辑。 View代表 UI 组件 ,它负责将数据模型转化成UI 展现出来。 ViewModel 监听模型数据的改变和控制视图行为、处理用户交互 ,简单理解就是一个同步View 和 Model的对象,连接Model和View。 ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。 VUE双向绑定原理 mvvm 双向绑定,采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter、getter

浅谈Android设计模式

╄→尐↘猪︶ㄣ 提交于 2020-10-05 00:37:32
浅谈Android设计模式 https://blog.csdn.net/xiaoming100001/article/details/80302143 干货|安卓APP崩溃捕获方案——xCrash http://blog.itpub.net/69945252/viewspace-2674668/ instance //双重检查模式DCL,在某些情况下会失效 if instance == null synchronized instance == null /静态内部类单例模式, SingleDemoHolder instance = SingleDemo enum INSTANCE ,println 补充下JVM对内部类的加载顺序 private static class SingleDemoHolder{ static { System.out.println("调用匿名内部类:Inner Static"); } private static final SingleDemo instance = new SingleDemo(3); } SingleDemo SingleDemoHolder.instance 建造者模式:用来创建复杂对象的模式,将其部件解耦。通常Android中的Dialog或者EventBus使用的时候会碰到。 abstract Builder

一文了解Zookeeper

喜欢而已 提交于 2020-10-03 12:02:23
Zookeeper是Apache开源的一个分布式框架,它主要为分布式应用提供协调服务。 Zookeeper主要负责存储和管理大家都关心的数据,一旦这些数据的状态发生变化,Zookeeper就会通知那些注册在Zookeeper上的服务。简单来讲就是zookeeper=文件系统+通知机制。 一 Zookeeper的数据结构 Zookeeper的数据结构与Unix文件系统很类似,整体上可以看作是一棵树,与Unix文件系统不同的是Zookeeper的每个节点都可以存放数据,每个节点称作一个ZNode,默认存储 1MB 的数据,每个ZNode都可以通过其路径唯一标识。 1.1 四种类型的ZNode 持久化目录节点:客户端与Zookeeper断开连接后,该节点依旧存在。 持久化顺序编号目录节点:客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称就行顺序编号。 临时目录节点:客户端与Zookeeper断开连接后,该节点被删除。 临时顺序编号目录节点:客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称就行顺序编号。 说明:创建ZNode时设置顺序标识,ZNode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。 1.2 stat结构体 ZNode主要包含以下信息: czxid-创建节点的事务 zxid: