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的设计模式之观察者模式(十)的更多相关文章

  1. Java 设计模式系列(十五)观察者模式(Observer)

    Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...

  2. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  3. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  4. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

  5. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  6. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  7. 迭代器模式 Iterator 行为型 设计模式(二十)

    迭代器模式(Iterator)   走遍天下,世界那么大,我想去看看   在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义 如果给定一个数组,我们可以通过for循 ...

  8. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  9. Java 设计模式系列(十八)备忘录模式(Memento)

    Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...

随机推荐

  1. 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记II ----线段树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4509 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但 ...

  2. 层层递进Struts1(七)详解DispatchAction

    通过前面几篇博客,不知道大家有没有发现这个问题,虽然现在可以灵活控制跳转了,但是Action的数量还是比较多,如何既能保证跳转灵活,还能减少Action的数量?这就是我们这篇博客所说的Dispatch ...

  3. 如何设置win7系统的文件夹为系统文件,从而隐藏文件夹

    1.如图所示,通过去掉勾选“隐藏受保护的操作系统文件(推荐)”和勾选“显示隐藏的文件.文件夹和驱动器”,可以查看系统所有文件

  4. 使用Codis搭建redis集群服务

    转(http://www.jianshu.com/p/f8e968e57863) 一. 应用场景 redis 作为数据结构存储引擎,有着很多优点 高性能单机引擎可以达到5-10W qps 数据结构全面 ...

  5. Unity NGUI UILabel文字变色 及相关问题

    在同一个UILabel中可以有不同颜色的文字只需要添加BBCode标记[ff0000]Red Label[-],那么在这个标记之间的RedLabel 就会变成红色 注意: 1.文本最终显示的颜色=Co ...

  6. 关于谷歌、火狐 右键没有发送到onenote选项

                              关于chrome .FF 右键没有发送到onenote选项 问题: 使用Microsoft  office中的onenote作为自己平时学习和工作的 ...

  7. PIC16F877A最小功能板 - 原理图系列

    一.顶层 主要由port转换.MCU.复位.键盘.晶振和显示等5部分电路组成. 二.模块层 1. port转换电路 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...

  8. [CSS] @keyframes

    @keyframes swing{ 0% { transform: rotate(0deg)} 100% {transform: rotate(-30deg)} } #sweetlandia{ ani ...

  9. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

  10. JDK5-可变参数

    如:public void function(int arg, int... args) 注意: 可变参数必须出现在参数列表的最后,否则使用数组 可变参数隐式地创建一个数组 如下程序: public ...