本文研究的主要是Django開發中的signal 的相關內容,具體如下。
在web開發中, 你可能會遇到下面這種場景:
在用戶完成某個操作后, 自動去執行一些后續的操作. 譬如用戶完成修改密碼后,
你要發送一份確認郵件.
當然可以把邏輯寫在一起,但是有個問題是,觸發操作一般不止一種(如用戶更改了其它信息的確認郵件),這時候這個邏輯會需要寫多次,所以你可能會想著DRY(Don't repeat yourself),于是你把它寫到了一個函數中,每次調用。當然這是沒問題的.
但是, 如果你換個思路你會發現另一個完全不同的方案, 即:
類似于daemon的程序監聽著特定的事件 前置操作來觸發相應的事件 監聽程序執行對應的操作這樣的好處是什么呢?
松耦合(不用把后續操作寫在主邏輯中) 便于復用(這也是為什么django本身,及第三方應用如pinax大量使用此技術的原因),在各種高級語言中都會有類似的特性,如java,javascript等,而在django中我們使用signal。Siganl是Django框架中提供的一個 “信號分發器”。它是設計模式中經常提到的觀察者模式的一個實現應用。
在此種模式中,一個目標物件管理所有相依于它的觀察者物件,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。
觀察者模式的使用場景
關聯行為場景,需要注意的是,關聯行為是可拆分的,而不是“組合”關系。 事件多級觸發場景。 跨系統的消息交換場景,如消息隊列、事件總線的處理機制。優點
1.解除耦合,讓耦合的雙方都依賴于抽象,從而使得各自的變換都不會影響另一邊的變換。
它在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的接口。被觀察者并不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。
由于被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬于不同的抽象化層次。這種耦合性使得代碼的可讀性、維護性大大提高。
2.觀察者模式實現了動態聯動;
由于觀察者模式對觀察者注冊實行管理,那就可以在運行期間,通過動態的控制注冊的觀察者來控制某個動作的聯動范圍,從而實現動態聯動。
3.觀察者模式支持廣播通信。
目標發送通知給觀察者是面向所有注冊的觀察者,所以目標每次通知的信息就要對所有注冊的觀察者進行廣播,也可以在目標上添加新的方法來限制廣播的范圍。
Django 中Siganl 機制的典型應用是,框架為 Models 創建了 pre_save、post_save等與Model的某些方法調用相關聯的信號,如pre_save 和 post_save 分別會在 Modle的save()方法的調用之前和之后通知觀察者,從而讓觀察者進行一系列操作。
新聞熱點
疑難解答