Python設(shè)計(jì)模式之觀察者模式簡單示例
本文實(shí)例講述了Python設(shè)計(jì)模式之觀察者模式。分享給大家供大家參考,具體如下:
觀察者模式是一個(gè)軟件設(shè)計(jì)模式,一個(gè)主題對(duì)象包涵一系列依賴他的觀察者,自動(dòng)通知觀察者的主題對(duì)象的改變,通常會(huì)調(diào)用每個(gè)觀察者的一個(gè)方法。這個(gè)設(shè)計(jì)模式非常適用于分布式事件處理系統(tǒng)。
典型的在觀察者模式下:
1.發(fā)布者類應(yīng)該包涵如下方法:
注冊(cè)能夠接收通知的對(duì)象
從主對(duì)象到注冊(cè)對(duì)象,通知任何變化
未注冊(cè)對(duì)象不能夠接收任何通知信息
2.訂購者類應(yīng)該包涵如下:
發(fā)布者會(huì)調(diào)用一個(gè)訂購者提供的方法,將任何改變告知注冊(cè)對(duì)象。
3.當(dāng)一個(gè)事件會(huì)觸發(fā)了狀態(tài)的改變,發(fā)表者會(huì)調(diào)用通知方法
總結(jié):訂閱者可以在發(fā)布對(duì)象中注冊(cè)或者不注冊(cè),如此無論什么事件發(fā)生,都會(huì)觸發(fā)發(fā)布者通過調(diào)用通知方法,去通知訂購者。這個(gè)通知只會(huì)在事件發(fā)生的時(shí)候,去通知已經(jīng)注冊(cè)的訂購者。
一個(gè)簡單的python實(shí)現(xiàn):
讓我們實(shí)現(xiàn)一個(gè)不同用戶在TechForum 上發(fā)布技術(shù)郵件的例子,當(dāng)任何用戶發(fā)布一個(gè)新的郵件,其他用戶就會(huì)接收到新郵件通知。從對(duì)象的角度去看,我們應(yīng)該有一個(gè) TechForum對(duì)象,我們需要有另外一些需要用戶對(duì)象在TechForum上注冊(cè),當(dāng)新郵件通知的時(shí)候,應(yīng)該發(fā)送郵件標(biāo)題。
一個(gè)簡單的例子分析會(huì)聯(lián)想到中介機(jī)構(gòu)和雇主的關(guān)系。這就是招聘者和應(yīng)聘者關(guān)系的延伸。通過一個(gè)工作中介會(huì)發(fā)布不同種類的工作信息,應(yīng)聘者會(huì)去尋找相關(guān)的工作信息,招聘者也會(huì)尋找在中介注冊(cè)過的應(yīng)聘者。
代碼如下:
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")
運(yùn)行結(jié)果:

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
利用Python半自動(dòng)化生成Nessus報(bào)告的方法
這篇文章主要介紹了利用Python半自動(dòng)化生成Nessus報(bào)告的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
pytorch model.cuda()花費(fèi)時(shí)間很長的解決
這篇文章主要介紹了pytorch model.cuda()花費(fèi)時(shí)間很長的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
使用python設(shè)置Excel工作表網(wǎng)格線的隱藏與顯示
Excel表格界面的直觀性很大程度上得益于表格中的網(wǎng)格線設(shè)計(jì),這些線條幫助用戶精確對(duì)齊數(shù)據(jù),清晰劃分單元格,本文將介紹如何使用Python設(shè)置隱藏或顯示Excel工作表的網(wǎng)格線,實(shí)現(xiàn)自動(dòng)話及批量處理,感興趣的朋友可以參考下2024-06-06

