一個可暫停的觀察者模式分析
阿新 • • 發佈:2018-10-27
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()實現了觀察者的操作,通過這些函數,實現了一個簡單的觀察者模式,並且可以自主操控暫停與恢復更新。
一個可暫停的觀察者模式分析