觀察者模式,核心抽象對象管理所有依賴他的其他類租副,并在設(shè)計中使其在發(fā)生變動時码撰,主動通知并更新其他類茬高;也叫模型-視圖模式、源-收聽者模式吧凉、從屬者模式隧出。
該模式必須包含兩個角色:觀察者和被觀察對象。在剛才的例子中客燕,業(yè)務(wù)數(shù)據(jù)是被觀察對象鸳劳,用戶界面是觀察者。觀察者和被觀察者之間存在“觀察”的邏輯關(guān)聯(lián)也搓,當(dāng)被觀察者發(fā)生改變的時候赏廓,觀察者就會觀察到這樣的變化涵紊,并且做出相應(yīng)的響應(yīng)。
我們設(shè)計一種應(yīng)用場景:當(dāng)客戶減少到閥值時幔摸,銷售通知工廠減少生產(chǎn)摸柄、人力資源開始裁人,反之則增加
示例code:
class Observer:
"""觀察者核心:銷售人員既忆,被觀察者number數(shù)據(jù)"""
def __init__(self):
self._number = None
self._department = []
@property
def number(self):
return self._number
@number.setter
def number(self, value):
self._number = value
print('當(dāng)前客戶數(shù):{}'.format(self._number))
for obj in self._department:
obj.change(value)
print('------------------')
def notice(self, department):
"""相關(guān)部門"""
self._department.append(department)
class Hr:
"""人事部門"""
def change(self, value):
if value < 10:
print("人事變動:裁員")
elif value > 20:
print("人事變動:擴員")
else:
print("人事不受影響")
class Factory:
"""工廠類"""
def change(self, value):
if value < 15:
print("生產(chǎn)計劃變動:減產(chǎn)")
elif value > 25:
print("生產(chǎn)計劃變動:增產(chǎn)")
else:
print("生產(chǎn)計劃保持不變")
if __name__ == '__main__':
observer = Observer()
hr = Hr()
factory = Factory()
observer.notice(hr)
observer.notice(factory)
observer.number = 10
observer.number = 15
observer.number = 20
observer.number = 25
當(dāng)前客戶數(shù):10
人事不受影響
生產(chǎn)計劃變動:減產(chǎn)
------------------
當(dāng)前客戶數(shù):15
人事不受影響
生產(chǎn)計劃保持不變
------------------
當(dāng)前客戶數(shù):20
人事不受影響
生產(chǎn)計劃保持不變
------------------
當(dāng)前客戶數(shù):25
人事變動:擴員
生產(chǎn)計劃保持不變
------------------
其中實現(xiàn)檢測值的核心方法是通過property將方法偽裝成屬性驱负,封裝了內(nèi)部的邏輯處理,而這邏輯中就包含更新相關(guān)對象的方法患雇。
image
使用場景:
- 一個抽象模型有兩個方面跃脊,其中一個方面依賴于另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復(fù)用苛吱。
- 一個對象的改變將導(dǎo)致其他一個或多個對象也發(fā)生改變酪术,而不知道具體有多少對象將發(fā)生改變,可以降低對象之間的耦合度翠储。
- 一個對象必須通知其他對象绘雁,而并不知道這些對象是誰。
- 需要在系統(tǒng)中創(chuàng)建一個觸發(fā)鏈援所,A對象的行為將影響B(tài)對象庐舟,B對象的行為將影響C對象……,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機制住拭。