觀察者模式在Django中的運用

觀察者模式就是根據某一對象的狀態變化自動更新與它相關的對象的狀態。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中的信號系統。

github連接:https://github.com/django/django/blob/c53af5661313079d022553b6c775e6c4f8d34927/django/dispatch/dispatcher.py#L19

當某一事件發生時,信號系統能夠容許一個或多個發送者(senders)將通知或信號(signals)推送給一組接受者(receivers)。

在這裏,

  發送者--被觀察者,即發送信號的對象

  信號--變化的狀態信息

  接受者--觀察者,接受信號並對其做出響應

咱們先建立一個信號,providing_args是該信號具備的參數

import django.dispatch status = django.dispatch.Signal(providing_args=['status'])

指定被觀察者,sender是被觀察者,status是信號的信息

status.send(sender=None, status=None)

指定觀察者並進行監聽receiver是觀察者

https://github.com/django/django/blob/c53af5661313079d022553b6c775e6c4f8d34927/django/dispatch/dispatcher.py#L49

status.connect(receiver=function)

最後實現回調函數function,在這裏面實現觀察者的響應函數

def function(params): # 實現響應 ...

 觀察者模式的好處:

1. 觀察者模式能夠實現表示層和數據邏輯層的分離,定義穩定消息更新傳遞機制,並抽象更新接口。
2. 觀察者模式的觀察目標和觀察者之間創建一種抽象的耦合。觀察者目標只須要維持一個抽象觀察者的集合,無須瞭解其具體觀察者。
3. 觀察者模式支持廣播通訊,觀察目標會向全部已註冊的觀察者對象發送通知,簡化一對多系統設計難度。
4. 觀察者模式知足開閉原則的要求。增長新的具體觀察者無須修改原有系統代碼,在具體觀察者與觀察目標之間不存在關聯關係的狀況下。增長新的觀察者目標也很方便。
相關文章
相關標籤/搜索