[Design Patterns] 03. Behavioral Patterns - Observer Pattern

前言


參考資源

Ref: 史上最全設計模式導學目錄(完整版) 設計模式

觀察者模式-Observer Pattern【學習難度:★★★☆☆,使用頻率:★★★★★】安全

對象間的聯動——觀察者模式(一):多人聯機對戰遊戲的設計app

對象間的聯動——觀察者模式(二):觀察者模式概述函數

對象間的聯動——觀察者模式(三):多人聯機對戰遊戲的觀察者模式解決方案學習

對象間的聯動——觀察者模式(四):JDK對觀察者模式的支持spa

對象間的聯動——觀察者模式(五):觀察者模式與Java事件處理.net

對象間的聯動——觀察者模式(六):觀察者模式與MVC,觀察者模式總結設計

 

 

核心問題

待解決的問題:一個事件發生了,如何讓全部觀察者都能察覺?code

將observer放在事件類中。orm

 

 

 

現實案例


1、事件類

class Publisher:

    def __init__(self):
        # 註冊好的觀察者都在這裏
        self.observers = []

# 添加「觀察者」
def add(self, observer): if observer not in self.observers: self.observers.append(observer) else: print('Failed to add: {}'.format(observer))
# 刪除「觀察者「
def remove(self, observer): try: self.observers.remove(observer) except ValueError: print('Failed to remove: {}'.format(observer))
# 通知每一位「觀察者」
def notify(self): [o.notify(self) for o in self.observers] ##########################################################
class DefaultFormatter(Publisher): def __init__(self, name): Publisher.__init__(self) self.name = name self._data = 0 def __str__(self): return "{}: '{}' has data = {}".format(type(self).__name__, self.name, self._data)
#----------------------------------------------------- @property
def data(self): return self._data @data.setter def data(self, new_value): try: self._data = int(new_value) except ValueError as e: print('Error: {}'.format(e)) else: self.notify()

 

 

2、try-except-else

當沒有異常發生時,else中的語句將會被執行。

a=3
b=2
for i in range(3):
    try:
        a = a - 1
        c=b/a
        print(c)

    except Exception as e:
        print(e)
    else:
        print("正常運行")

保證了「危險代碼「安全經過後再執行」關鍵操做」。

"觀察者「添加成功後,再作」事件賦值「。

 

 

3、定義 」觀察者「 

這裏定義了兩名」觀察者「,一點事件發生,」觀察者「給出各自的呼應。

也就是說:添加數據成功則調用 」觀察者「 的 」嘴「。

class HexFormatter:

    def notify(self, publisher):
        print("{}: '{}' has now hex data = {}".format(type(self).__name__, publisher.name, hex(publisher.data)))


class BinaryFormatter:

    def notify(self, publisher):
        print("{}: '{}' has now bin data = {}".format(type(self).__name__, publisher.name, bin(publisher.data)))

 

 

4、主函數

」事件「 發生,關鍵是要」當即通知到觀察者「,怎麼辦?即刻觸發一個」遍歷全部observers「的循環。

def main():
# (1) 建立一個 」事件「 df
= DefaultFormatter('test1') print(df)
# (2) 建立一個」觀察者「,並添加之
print() hf = HexFormatter() df.add(hf) df.data = 3  # (3)」事件「 發生,關鍵是要」當即通知到觀察者「 print(df) bf = BinaryFormatter() df.add(bf) df.data = 21 print(df) df.remove(hf) df.data = 40 print(df) print() df.remove(hf) df.add(bf) df.data = 'hello' print(df) print() df.data = 15.8 print(df)
if __name__ == '__main__': main()

 

 

  如何看來,就是這個」循環體「中(事件中)對內容(觀察者)的控制。

 

End.

相關文章
相關標籤/搜索