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中是一種讓我們代碼可讀性的一種捷徑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM