Zookeeper的设计模式之观察者模式(十)
Watcher是Zookeeper用来实现distribute lock, distribute configure, distribute queue等应用的主要手段。要监控data_tree上的任何节点的变化(节点本身的增加,删除,数据修改,以及孩子的变化)都可以在获取该数据时注册一个Watcher,这有很像Listener模式。一旦该节点数据变化,Follower会发送一个notification response,client收到notification响应,则会查找对应的Watcher并回调他们。 有以下接口可以注册Watcher:
1. Stat exists(final String path, Watcher watcher)
2. Stat exists(String path, boolean watch)
3. void exists(String path, boolean watch, StatCallback cb, Object ctx)
4. void exists(final String path, Watcher watcher, StatCallback cb, Object ctx)
5. byte[] getData(final String path, Watcher watcher, Stat stat)
6. byte[] getData(String path, boolean watch, Stat stat)
7. void getData(final String path, Watcher watcher, DataCallback cb, Object ctx)
8. void getData(String path, boolean watch, DataCallback cb, Object ctx)
9. List<string> getChildren(final String path, Watcher watcher)
10. List<string> getChildren(String path, boolean watch)
11. void getChildren(final String path, Watcher watcher,ChildrenCallback cb, Object ctx)
如果参数需要传递watcher,则可以自己定义Watcher进行回调处理。如果是Boolean型变量,当为true时,则使用系统默认的Watcher,系统默认的Watcher是在zookeeper的构造函数中传递的Watcher。如果Watcher为空或者Boolean变量时为false,则表明不注册Watcher。如果获取数据后不需要关注该数据是否变化,就不需要注册Watcher。上面没有返回值的都是异步调用模式。需要注意的是,一旦Watcher被调用后,将会从map中删除,如果还需要关注数据的变化,需要再次注册。
Watcher的使用与注意事项
1.Watcher需要每次都要注册。
2.Watcher回调之后就销毁如果打算再次回调就需要再次注册
观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
观察者模式在状态检测和事件处理等场景中是非常有用的。这种模式确保一个核心对象可以由一组未知并可能正在扩展的“观察者”对象来监控。一旦核心对象的某个值发生变化,它通过调用update()函数让所有观察者对象知道情况发生了变化。各个观察者在核心对象发生变化时,有可能会负责处理不同的任务;核心对象不知道也不关心这些任务是什么,通常观察者也同样不知道,不关心其他的观察者正在做什么。
观察者模式之python实现
class Inventory:
"""docstring for ClassName"""
def __init__(self):
self.observers=[]
self._product=None
self._quantity=0
def attach(self,observer):
self.observers.append(observer) @property
def product(self):
return self._product
@product.setter
def product(self,value):
self._product=value
self._update_observers() @property
def quantity(self):
return self._quantity
@quantity.setter
def quantity(self,value):
self._quantity=value
self._update_observers()
def _update_observers(self):
for observer in self.observers:
observer()
class ConsoleObserver:
"""docstring for ConsoleObserver"""
def __init__(self, Inventory):
self.Inventory=Inventory
def __call__(self):
print(self.Inventory.product) print(self.Inventory.quantity)
>>> import ObserverPatternDemo
>>> i=ObserverPatternDemo.Inventory()
>>> c=ObserverPatternDemo.ConsoleObserver(i)
>>> i.attach(c)
>>> i.product="Hello world!"Hello world!
0
>>> i.quantity=999
Hello world!
999
这个对象两个属性,对其执行赋值,便调用_update_observers方法。该方法所做的工作就是对所有可用的观察者进行遍历,好让他们知道发生了一些变化。这里直接调用__call__函数来处理变化。这在其他许多编程语言是不能的,在python中是一种让我们代码可读性的一种捷径。
Zookeeper的设计模式之观察者模式(十)的更多相关文章
- Java 设计模式系列(十五)观察者模式(Observer)
Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- 迭代器模式 Iterator 行为型 设计模式(二十)
迭代器模式(Iterator) 走遍天下,世界那么大,我想去看看 在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义 如果给定一个数组,我们可以通过for循 ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- Java 设计模式系列(十八)备忘录模式(Memento)
Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...
随机推荐
- C#三种判断数据库中取出的字段值是否为空(NULL) 的方法
操作数据库,需要判断返回的字段值是否为空,收集了3种方法供参考 1 通过System.DBNull判断,网上大部分都使用这个方法. DataTable dt; ...
- codeforces 710C
C. Magic Odd Square time limit per test 1 second memory limit per test 256 megabytes input standard ...
- eclipse的svn插件安装方式
eclipse的插件安装一般有3种方式: 1)通过eclipse的Help/ Install New Software...中, 点击Add, 添加一个在线更新地址,如:http://subclips ...
- 【Java】集合_Collections_学习记录
一.Collections工具类概述 1.为List.Set.Map等集合提供大量方法对集合元素进行排序.查询和修改等操作. 2.将集合对象设置为不可变. 3.对集合对象实现同步控制等. 二.排序操作 ...
- Mina学习之与Spring整合
本章中演示在Spring中整合Mina,为了整合到Spring,需要做以下几个步骤: 1. 设置IoHandler <bean id="trapHandler" class= ...
- 跨服务器修改数据 分类: SQL Server 2014-08-21 21:24 316人阅读 评论(0) 收藏
说明: 两个服务器: 192.168.0.22 A 192.168.0.3 B 数据库备份在A上 数据库在B上 在A上写: exec sp_addlinkedserver 'ITSV ...
- 【原创】javascript——事件思维导图
- eclipse GWT开发环境的离线布置方法
安装方法http://blog.csdn.net/u011029071/article/details/10143841 用eclipse自动更新安装失败N次,还是得手动来 以Google Plugi ...
- [Windows] Adobe Photoshop CC 2015官方原版下载 附破解补丁&破解教程
Photoshop自CS6以后改为CC,目前Photoshop CC 2015是最新版,发布日期为2015年6月. <ignore_js_op> 下载安装主程序: 主程序及补丁下载地址 ...
- Android 官方命令深入分析
原文:www.libgdx.cn Android SDK包括了多种工具来帮助你创建基于Android平台的移动应用.这些工具一般分成两类:SDK 工具和 platform 工具. SDK 工具是独立的 ...