Observer

Observer

偶尔善良 提交于 2019-12-12 16:50:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1 观察者模式结构图 2 观察者模式结构实现 /** * 观察者模式 * @author Wenwu 2019/12/11 */ /** * 抽象观察者 * @author Wenwu 2019/12/11 */ interface Observer{ /** * 观察者名称 * @author Wenwu 2019/12/11 */ val observerName: String /** * 当主体状态改变时,更新通知 * @param msg 通知消息 * @author Wenwu 2019/12/11 */ fun update(msg: String) } /** * 抽象主题(抽象被观察者) * 定义主题行为 * @author Wenwu 2019/12/11 */ interface Subject { // 观察者们 val observers: MutableList<Observer> // 通知观察者的消息 var msg: String // 添加观察者 fun addObserver(o: Observer) { if (!observers.contains(o)) observers.add(o) } // 删除观察者 fun deleteObserver(o:

阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景

筅森魡賤 提交于 2019-12-09 12:23:51
随着信息化水平的不断提高,企业级应用系统变得越来越庞大,性能随之下降,用户抱怨频频。拆分系统是目前我们可选择的解决系统可伸缩性和性能问题的唯一行之有效的方法。但是拆分系统同时也带来了系统的复杂性——各子系统不是孤立存在的,它们彼此之间需要协作和交互(分布式系统)。各个子系统就好比动物园里的动物,为了使各个子系统能正常为用户提供统一的服务,必须需要一种机制来进行协调——这就是ZooKeeper(动物园管理员)。下面详解: 什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来 解决分布式应用中经常遇到的一些数据管理问题 ,如: 统一命名服务 状态同步服务 集群管理 分布式应用配置项的管理等 Zookeeper已经成为Hadoop生态系统中的基础组件。 Zookeeper的基本原理和架构 1、Zookeeper的角色 领导者(leader): 负责进行投票的发起和决议,更新系统状态。 学习者(learner): 包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票。 Observer: 可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度

LiveData原理分析

可紊 提交于 2019-12-04 21:35:44
LiveData原理分析 1 LiveData简介 大部分Android应用会从网络或SQLite数据库存取数据,并根据数据更新界面。为了避免ANR,主线程中不能存取数据。而后台线程中无法更新界面。通常的做法是让后台线程将数据通过Handler传递给主线程。但是当界面较为复杂时,使用Handler这种方式变得非常复杂。为了简化界面更新的工作,Google在Jetpack中提供了LiveData组件。LiveData具有保证UI和状态一致、避免内存泄漏、避免手动管理生命周期等优点。 2 LiveData用法 LiveData是一个在线程间传递数据的容器。当后台线程得到数据后,通过postValue()方法投递数据。其他线程通过getValue()得到数据。为了通知其他线程,LiveData采用的观察者模式。通过observe()方法,主线程可以在数据更新后立即得到通知。下面是一个简单的例子: public class BackgroundThread extends Thread { public BackgroundThread(LiveData<Data> aLiveData) { liveData = aLiveData; } @Override public void run() { Data data = readDataFromFile(); liveData

使用Hbase协作器(Coprocessor)同步数据到ElasticSearch

非 Y 不嫁゛ 提交于 2019-12-04 15:28:10
使用Hbase协作器(Coprocessor)同步数据到ElasticSearch 最近项目中需要将Hbase中的数据同步到ElasticSearch中,需求就是只要往Hbase里面put或者delete数据,那么ES集群中,相应的索引下,也需要更新或者删除这条数据。本人使用了hbase-rirver插件,发现并没有那么好用,于是到网上找了一些资料,自己整理研究了一下,就自己写了一个同步数据的组件,基于Hbase的协作器,效果还不错,现在共享给大家,如果大家发现什么需要优化或者改正的地方,可以在我的csdn博客:我的csdn博客地址上面私信我给我留言,代码托管在码云上Hbase-Observer-ElasticSearch。同时要感谢Gavin Zhang 2shou,我虽然不认识Gavin Zhang 2shou,(2shou的同步数据博文)但是我是看了他写的代码以及博客之后,(2shou的同步组件代码)在他的基础之上对代码做了部分优化以及调整,来满足我本身的需求,所以在此表示感谢,希望我把我的代码开源出来,其他人看到之后也能激发你们的灵感,来写出更多更好更加实用的东西: Hbase协作器(Coprocessor) 编写组件 部署组件 验证组件 总结 Hbase协作器(Coprocessor) HBase 0.92版本后推出了Coprocessor — 协处理器

观察者模式

自作多情 提交于 2019-12-04 06:16:46
观察者模式(Observer Pattern)也叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式。这个模式的一个最重要的作用就是解耦。也就是将被观察者和观察者进行解耦,使得他们之间的依赖性更小,甚至做到毫无依赖。在观察者模式中它定义了一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。 1. 观察者模式结构 一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其他的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作。观察者模式是满足这一要求的各种设计方案中最重要的一种。下面以一个简单的示意性实现为例,讨论观察者模式的结构。 观察者模式主要包含四种角色: Subject:抽象主题,也就是上面的被观察者(Observable)角色。Subject把所有观察者对象的引用保存在一个集合里,并且能够动态的增加、取消观察者 Observer:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口 ConcreteSubject:具体主题,也就是具体的被观察者,将有关状态存入具体观察者对象

C++和JAVA下的内存资源管理

放肆的年华 提交于 2019-12-03 02:12:25
1.引言 不管在哪种系统平台/编程语言下,内存资源管理是非常重要的问题,稍不留意就会导致内存泄漏,更有甚者访问非法空间,导致错误。说到底,没有在合适的时机释放对象,或者访问了已经释放的资源。在有垃圾回收的语言中,由平台环境负责资源的及时回收;在C++中则需要程序员自己把握,在一些多线程状态下,对象资源的释放时机常常不好把握,导致了各种各样的问题。为什么大家喜欢用带有GC功能的语言做开发,是因为少了太多的心智负担(JAVA, C#, Python ...)。 2.C++下的资源管理方式 2.1 针对原生指针的资源管理 针对原生指针的管理方式,学校老师常常这么教:谁创建、谁释放。要配对,不过现实往往没那么理想,在单线程处理程序中这样没有问题,但是在多线程中有时候做不到。我现在通常的做法是做一个簿记工作,对于系统中大量使用的对象资源,尤其是跨线程使用的,会集中管理登记,并配以状态标记,确认对象使用完毕后再行释放。对象自身跟随业务状态变化,有明确的开始和结束状态。 2.2 通过智能指针进行资源管理 在C++ 中有多种类型的智能指针,有些被重用,而有些却被放弃,在陈硕的《Linux多线程服务端编程》中,推荐使用shared_ptr以及weak_ptr进行资源管理。此处梳理一下C++中的智能指针。看看各自如何使用,适合在什么场景下使用。 2.2.1 unique_ptr unique

《JAVA核心知识》学习笔记 (11. Zookeeper)

▼魔方 西西 提交于 2019-11-30 13:32:42
11.1.1. Zookeeper 概念 Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。 Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但 只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控与 通知机制 11.1.1. Zookeeper 角色 Zookeeper 集群是一个基于主从复制的高可用集群,每个服务器承担如下三种角色中的一种 11.1.1.1. Leader 1. 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader,它会发起并维护与各 Follwer 及 Observer 间的心跳。 2. 所有的写操作必须要通过 Leader 完成再由 Leader 将写操作广播给其它服务器。 只要有超过 半数节点(不包括 observeer 节点) 写入成功,该写请求就会被提交(类 2PC 协议)。 11.1.1.2. Follower 1. 一个 Zookeeper 集群可能同时存在多个 Follower,它会响应 Leader 的心跳, 2. Follower 可直接处理并返回客户端的读请求,同时会将写请求转发给 Leader 处理, 3. 并且负责在 Leader 处理写请求时对请求进行投票 11.1.1.3.

你应该要知道的Vue.js

送分小仙女□ 提交于 2019-11-30 10:22:35
原文: 你应该要知道的Vue.js 该篇文章主要对Vue中应该要掌握的知识点的一些整理。只是一个引子,并没有过多的深入,但是希望能根据这篇文章从各个点对Vue有一个更好的了解,对自己有一个更好的定位。只会用API的前端不是好的程序员。 组件data为什么必须是函数? 因为组件可能被多处使用,但它们的data是私有的,所以每个组件都要return一个新的data对象,如果共享data,修改其中一个会影响其他组件 组件通信 父子组件通信: $on 、 $emit 非父子组件的通信: event bus 复杂情况: vuex 怎么动态添加组件 场景:在vue中,点击button,随机生成a、b、c组件中的一个 is render 思路:设定一个components数组,button点击一次,push一个组件名, v-for 遍历components,并用 is 或 render 动态生成 vue-loader是什么? vue-loader 是一个 webpack 的 loader,可以将单文件组件转换为 JavaScript 模块 引用文档的说法: 默认支持 ES2015 ; 允许对 Vue 组件的组成部分使用其它 webpack loader ,比如对 <style> 使用 Sass 和对 <template> 使用 Jade ; .vue 文件中允许自定义节点,然后使用自定义的

C++11 实现简易的信号槽

无人久伴 提交于 2019-11-29 19:14:42
在Qt中对象间通信,广泛使用了信号槽机制。Qt信号机制是通过语法扩展实现的,因此定制性更好,使用更便利。 这篇文章所实现的信号槽机制,则没有扩展语法,通过简单的模板实现。 #include <iostream> #include <memory> #include <string> #include <functional> #include <vector> #define signals public #define slots template<typename Signature> class Signal; template<typename Ret, typename... Args> class Signal<Ret(Args...)> final { using Slot = std::function<void(Args&&...)>; public: Signal(){} void connect(const Slot &slot) { slots_.push_back(slot); } void emit(Args&&... args) { for(auto &slot : slots_){ slot(std::forward<Args>(args)...); } } private: std::vector<Slot> slots_; }; template

RxJava简单源码分析

久未见 提交于 2019-11-29 18:32:25
本文基于rxjava-2.1.7 demo代码如下 public class ObservableTest { public static void main(String[] args) { Observable<Object> observable = Observable.create(new ObservableOnSubscribe<Object>() { @Override public void subscribe(ObservableEmitter<Object> observer) throws Exception { observer.onNext("处理的数字是:" + Math.random() * 100); observer.onComplete(); } }); observable.subscribe(new Consumer<Object>() { @Override public void accept(Object consumer) throws Exception { System.out.println("我处理的元素是:" + consumer); } }); } } 先看第一行代码 Observable<Object> observable = Observable.create(new ObservableOnSubscribe