1. 程式人生 > >一個可暫停的觀察者模式分析

一個可暫停的觀察者模式分析

true 變化 項目 https err == 性能 缺失 ati

一,觀察者模式

1、概念介紹

  觀察者模式(Observer)完美的將觀察者和被觀察的對象分離開。舉個例子,用戶界面可以作為一個觀察者,業務數據是被觀察者,用戶界面觀察業務數據的變化,發現數據變化後,就顯示在界面上。面向對象設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,並且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。

2、實現方式

  Observer模式有很多實現。基本上,模式必須包含兩個角色:觀察者和觀察對象。在前面的示例中,業務數據是觀察對象,用戶界面是觀察者。觀察者和觀察者之間存在邏輯關系。隨著觀察者的變化,觀察者觀察到這些變化並作出相應的反應。如果在用戶界面和業務數據之間使用此類觀察過程,則可以確認界面和數據已明確定義。假設應用程序需要更改,您需要更改接口的性能。用戶界面,業務數據需要重建。不需要改變。

二、案例分析

  為了更直觀地去理解觀察者模式,筆者在這裏選用github上一個“可暫停的觀察者模式”項目進行分析,幫助讀者更加直觀地去理解觀察者模式在軟件中的作用。該項目的github地址為https://github.com/virtualnobi/PausableObserverPattern

class PausableObservable(ObserverPattern.Observable): 
    """
  這是一個可以暫停的觀察者對象,可以暫停和恢復更新過程的觀察者對象。

  暫停哪些更新可以取決於:
  1、可觀察的類或實例
  2、要更新的部分
  3、觀察者的類或實例

  通過pasueUpdates()和resumeUpdates()來控制暫停的更新。
""" PausedTriples = [] # Class Methods @classmethod def pauseUpdates(clas, observable, aspect, observer): """
     暫停更新的實現。

     如果observable, aspect, observer為None,則它充當於一個通配符,意味著它可以匹配任意字符。

     observable暫停所有來源於(from)此對象的更新(如果它是一個類,則暫停所有實例的更新)

     字符串/Unicode方面指定要暫停的方面

     observer暫停此對象上(at)的所有更新(如果它是一個類,則暫停所有實例的更新)
""" if ((aspect <> None) and (not isinstance(aspect, str)) and (not isinstance(aspect, unicode))): raise TypeError, pauseUpdates(): aspect must be either None, str or unicode! clas.PausedTriples.append((observable, aspect, observer)) @classmethod def resumeUpdates(clas, observable, aspect, observer): """
     按照指定進行更新。

     observable, aspect, observer三方面必須對應於先前調用pasueUpdates()的參數,否則會拋出異常。
""" toRemove = None for triple in clas.PausedTriples: if ((triple[0] == observable) and (triple[1] == aspect) and (triple[2] == observer)): toRemove = triple break if (toRemove): clas.PausedTriples.remove(toRemove) else: raise ValueError def doUpdateAspect(self, observer, aspect): """
     如果未暫停更新,請調用觀察者的updateAspect()方法。
""" stop = False for triple in self.__class__.PausedTriples: if (self.matches(triple[0], self) and ((triple[1] == None) or (triple[1] == aspect)) and self.matches(triple[2], observer)): print(PausableObservable: Paused update of aspect "%s" of %s to %s % (aspect, self, observer)) stop = True break if (not stop): observer.updateAspect(self, aspect)

def matches(self, matchingSpec, matchingObject): """
     檢擦對象是否與給定的規範匹配。
       如果對象等於matchingSpec或它的類,則匹配。若匹配規則缺失,則可以匹配任意對象。
       返回一個布爾值。
""" return((None == matchingSpec) or (matchingSpec == matchingObject) or (inspect.isclass(matchingSpec) and isinstance(matchingObject, matchingSpec))) # Class Initialization pass # Executable Script if __name__ == "__main__": pass

  可以看出,該項目通過pauseUpdates() and resumeUpdates()兩個函數實現了對被觀察的對象的暫停與恢復更新,而pauseUpdates(),resumeUpdates()與doUpdateAspect()實現了觀察者的操作,通過這些函數,實現了一個簡單的觀察者模式,並且可以自主操控暫停與恢復更新。

一個可暫停的觀察者模式分析