Python設計模式之觀察者模式簡單示例
本文實例講述了Python設計模式之觀察者模式。分享給大家供大家參考,具體如下:
觀察者模式是一個軟件設計模式,一個主題對象包涵一系列依賴他的觀察者,自動通知觀察者的主題對象的改變,通常會調用每個觀察者的一個方法。這個設計模式非常適用于分布式事件處理系統(tǒng)。
典型的在觀察者模式下:
1.發(fā)布者類應該包涵如下方法:
注冊能夠接收通知的對象
從主對象到注冊對象,通知任何變化
未注冊對象不能夠接收任何通知信息
2.訂購者類應該包涵如下:
發(fā)布者會調用一個訂購者提供的方法,將任何改變告知注冊對象。
3.當一個事件會觸發(fā)了狀態(tài)的改變,發(fā)表者會調用通知方法
總結:訂閱者可以在發(fā)布對象中注冊或者不注冊,如此無論什么事件發(fā)生,都會觸發(fā)發(fā)布者通過調用通知方法,去通知訂購者。這個通知只會在事件發(fā)生的時候,去通知已經注冊的訂購者。
一個簡單的python實現(xiàn):
讓我們實現(xiàn)一個不同用戶在TechForum 上發(fā)布技術郵件的例子,當任何用戶發(fā)布一個新的郵件,其他用戶就會接收到新郵件通知。從對象的角度去看,我們應該有一個 TechForum對象,我們需要有另外一些需要用戶對象在TechForum上注冊,當新郵件通知的時候,應該發(fā)送郵件標題。
一個簡單的例子分析會聯(lián)想到中介機構和雇主的關系。這就是招聘者和應聘者關系的延伸。通過一個工作中介會發(fā)布不同種類的工作信息,應聘者會去尋找相關的工作信息,招聘者也會尋找在中介注冊過的應聘者。
代碼如下:
class Publisher:
def __init__(self):
pass
def register(self):
pass
def unregister(self):
pass
def notifyAll(self):
pass
class TechForum(Publisher):
def __init__(self):
self._listOfUsers = []
self.postname = None
def register(self, userObj):
if userObj not in self._listOfUsers:
self._listOfUsers.append(userObj)
def unregister(self, userObj):
self._listOfUsers.remove(userObj)
def notifyAll(self):
for objects in self._listOfUsers:
objects.notify(self.postname)
def writeNewPost(self , postname):
self.postname = postname
self.notifyAll()
class Subscriber:
def __init__(self):
pass
def notify(self):
pass
class User1(Subscriber):
def notify(self, postname):
print "User1 notified of a new post %s" % postname
class User2(Subscriber):
def notify(self, postname):
print "User2 notified of a new post %s" % postname
class SisterSites(Subscriber):
def __init__(self):
self._sisterWebsites = ["Site1" , "Site2", "Site3"]
def notify(self, postname):
for site in self._sisterWebsites:
print "Send nofication to site:%s " % site
if __name__ == "__main__":
techForum = TechForum()
user1 = User1()
user2 = User2()
sites = SisterSites()
techForum.register(user1)
techForum.register(user2)
techForum.register(sites)
techForum.writeNewPost("Observe Pattern in Python")
techForum.unregister(user2)
techForum.writeNewPost("MVC Pattern in Python")
運行結果:

更多關于Python相關內容可查看本站專題:《Python數(shù)據(jù)結構與算法教程》、《Python Socket編程技巧總結》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。

