觀察者模式是一個軟件設計模式,一個主題對象博包涵一系列依賴他的觀察者,自動通知觀察者的主題對象的改變,通常會調用每個觀察者的一個方法。這個設計模式非常適用於分布式事件處理系統。
典型的在觀察者模式下:
1.發布者類應該包涵如下方法:
- 注冊能夠接收通知的對象
- 從主對象到注冊對象,通知任何變化
- 未注冊對象不能夠接收任何通知信息
2.訂購者類應該包涵如下:
- 發布者會調用一個訂購者提供的方法,將任何改變告知注冊對象。
3.當一個事件會觸發了狀態的改變,發表者會調用通知方法
總結:訂閱者可以在發布對象中注冊或者不注冊,如此無論什么事件發生,都會觸發發布者通過調用通知方法,去通知訂購者。這個通知只會在事件發生的時候,去通知已經注冊的訂購者。
一個簡單的python實現:
讓我們實現一個不同用戶在TechForum 上發布技術郵件的例子,當任何用戶發布一個新的郵件,其他用戶就會接收到新郵件通知。從對象的角度去看,我們應該有一個 TechForum對象,我們需要有另外一些需要用戶對象在TechForum上注冊,當新郵件通知的時候,應該發送郵件標題。
一個簡單的例子分析會聯想到中介機構和雇主的關系。這就是招聘者和應聘者關系的延伸。通過一個工作中介會發布不同種類的工作信息,應聘者會去尋找相關的工作信息,招聘者也會尋找在中介注冊過的應聘者。
代碼如下:
1 classPublisher: 2 def__init__(self): 3 pass 4 5 defregister(self): 6 pass 7 8 defunregister(self): 9 pass 10 11 defnotifyAll(self): 12 pass 13 14 classTechForum(Publisher): 15 def__init__(self): 16 self._listOfUsers = [] 17 self.postname = None 18 defregister(self, userObj): 19 if userObj notin self._listOfUsers: 20 self._listOfUsers.append(userObj) 21 22 defunregister(self, userObj): 23 self._listOfUsers.remove(userObj) 24 25 defnotifyAll(self): 26 for objects in self._listOfUsers: 27 objects.notify(self.postname) 28 29 defwriteNewPost(self , postname): 30 self.postname = postname 31 self.notifyAll() 32 33 34 classSubscriber: 35 def__init__(self): 36 pass 37 38 defnotify(self): 39 pass 40 41 42 classUser1(Subscriber): 43 defnotify(self, postname): 44 print"User1 notified of a new post %s" % postname 45 46 47 classUser2(Subscriber): 48 defnotify(self, postname): 49 print"User2 notified of a new post %s" % postname 50 51 52 classSisterSites(Subscriber): 53 def__init__(self): 54 self._sisterWebsites = ["Site1" , "Site2", "Site3"] 55 56 defnotify(self, postname): 57 for site in self._sisterWebsites: 58 print"Send nofication to site:%s " % site 59 60 61 62 if __name__ == "__main__": 63 techForum = TechForum() 64 65 user1 = User1() 66 user2 = User2() 67 sites = SisterSites() 68 69 techForum.register(user1) 70 techForum.register(user2) 71 techForum.register(sites) 72 73 74 techForum.writeNewPost("Observe Pattern in Python") 75 76 techForum.unregister(user2) 77 78 techForum.writeNewPost("MVC Pattern in Python")
