觀察者模式就是根據某一對象的狀態變化自動更新與它相關的對象的狀態。git
一. demo演示github
如下是我本身實現觀察者模式的一個demo。數據庫
被觀察者:django
Plant: 當植物的狀態變動時,會通知觀察者。植物的初始狀態是「new」。app
觀察者:框架
Worker: 若是植物的狀態是「ill」,園丁就須要工做;不然什麼也不作。函數
Eater: 若是植物的狀態是「ok」,吃貨就會吃掉植物;不然什麼也不作。網站
1 class Observer(object): 2 """觀察者的接口""" 3 4 def update(self): 5 return 6 7 def display(self): 8 return 9 10 class Observed(object): 11 """被觀察者的接口""" 12 13 def registerObserver(self): 14 return 15 16 def removeObserver(self): 17 return 18 19 def notifyObserver(self): 20 return 21 22 def display(self): 23 return 24 25 class Plant(Observed): 26 """植物類:實現了被觀察者接口""" 27 28 def __init__(self, name): # 初始化 29 self.observers = [] 30 self.status = 'new' 31 self.name = name 32 33 def registerObserver(self, observer): # 添加觀察者 34 if observer not in self.observers: 35 self.observers.append(observer) 36 else: 37 print("Fail to register this observer!") 38 39 def removeObserver(self, observer): # 移除觀察者 40 if observer not in self.observers: 41 self.observers.remove(observer) 42 else: 43 print("Fail to remove this observer!") 44 45 def notifyObserver(self): # 通知觀察者狀態變化了 46 for o in self.observers: 47 o.update(self.status) 48 49 def display(self): # 輸出被觀察者的狀態 50 print("this is a %s tree, and its status is %s" %(self.name, self.status)) 51 52 def setStatus(self, status): # 設置被觀察者的狀態 53 if self.status == status: 54 return 55 else: 56 self.status = status 57 self.notifyObserver() 58 59 class Worker(Observer): 60 """園丁類:負責維護植物,實現了觀察者接口""" 61 62 def __init__(self, plant): 63 self.plant = plant 64 self.doing = "nothing" 65 plant.registerObserver(self) 66 67 def update(self, status): # 根據觀察者反饋更新本身的狀態 68 if status=="ill": 69 self.doing = "work" 70 else: 71 self.doing = "nothing" 72 73 def display(self): # 展現 74 print("I am a planter, my plant is %s and i doing %s" %(self.plant.status, self.doing)) 75 76 class Eater(Observer): 77 """吃貨:負責吃掉植物,實現啦觀察者接口""" 78 79 def __init__(self, plant): 80 self.plant = plant 81 self.doing = "nothing" 82 plant.registerObserver(self) 83 84 def update(self, status): # 根據觀察者反饋更新本身的狀態 85 if status=="ok": 86 self.doing = "work" 87 else: 88 self.doing = "nothing" 89 90 def display(self): # 展現 91 print("I am a eater, my plant is %s and i doing %s" %(self.plant.status, self.doing)) 92 93 def main(): 94 apple = Plant("apple") 95 worker = Worker(apple) 96 eater = Eater(apple) 97 apple.display() 98 worker.display() 99 eater.display() 100 print() 101 102 apple.setStatus("ok") 103 apple.display() 104 worker.display() 105 eater.display() 106 print() 107 108 apple.setStatus("ill") 109 apple.display() 110 worker.display() 111 eater.display() 112 print() 113 114 main()
二. Djangothis
Django是一個開放源代碼的Web應用框架,由Python寫成。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容爲主的網站的。並於2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。Django的主要目標是使得開發複雜的、數據庫驅動的網站變得簡單。Django注重組件的重用性和「可插拔性」,敏捷開發和DRY法則(Don't Repeat Yourself)。在Django中Python被廣泛使用,甚至包括配置文件和數據模型。spa
與觀察者模式相關的主要是其中的Django中的信號系統。
當某一事件發生時,信號系統能夠容許一個或多個發送者(senders)將通知或信號(signals)推送給一組接受者(receivers)。
在這裏,
發送者--被觀察者,即發送信號的對象
信號--變化的狀態信息
接受者--觀察者,接受信號並對其做出響應
咱們先建立一個信號,providing_args是該信號具備的參數
import django.dispatch status = django.dispatch.Signal(providing_args=['status'])
指定被觀察者,sender是被觀察者,status是信號的信息
status.send(sender=None, status=None)
指定觀察者並進行監聽,receiver是觀察者
status.connect(receiver=function)
最後實現回調函數function,在這裏面實現觀察者的響應函數
def function(params): # 實現響應 ...
觀察者模式的好處: