-
內(nèi)容:定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變的時候,所有依賴于它的對象得到通知并被自動更新。觀者者模式又稱為“發(fā)布-訂閱”模式。比如天氣預(yù)報(bào),氣象局分發(fā)氣象數(shù)據(jù)。
-
角色:文章來源:http://www.zghlxwxcb.cn/news/detail-613638.html
- 抽象主題(Subject)
- 具體主題(ConcreteSubject)——發(fā)布者
- 抽象觀察者(Observer)
- 具體觀察者(ConcreteOserver)——訂閱者
-
舉個例子
需求:公司可以向每個訂閱的員工發(fā)送消息,員工可以選擇需不需要訂閱文章來源地址http://www.zghlxwxcb.cn/news/detail-613638.html
from abc import ABCMeta,abstractmethod
# 定義頂層代碼
# 抽象訂閱者
class Observer(metaclass=ABCMeta):
@abstractmethod
def update(self,notice):
pass
# 抽象發(fā)布者
class Notice:
def __init__(self):
self.observers=[]
def attach(self,obs):
self.observers.append(obs)
def detach(self,obs):
self.observers.remove(obs)
def notify(self):
for obs in self.observers:
obs.update(self)
class StaffNitice(Notice):
def __init__(self,company_info=None):
super().__init__()
# 處理成私有對象
self.__company_info=company_info
# 類似于get
@property
def company_info(self):
return self.__company_info
# 類似于set
@company_info.setter
def company_info(self,info):
self.__company_info=info
self.notify()# 推送
class Staff(Observer):
def __init__(self):
self.company_info=None
def update(self, notice):
self.company_info=notice.company_info
notice=StaffNitice("初始公司信息")
s1=Staff()
s2=Staff()
notice.attach(s1)
notice.attach(s2)
notice.company_info="公司今年業(yè)績很好,給大家發(fā)獎金"
print(s1.company_info)
print(s2.company_info)
notice.detach(s1)
notice.company_info="公司明天放假"
print(s1.company_info)
print(s2.company_info)
- 適用場景;
- 當(dāng)一個抽象模型有兩個方面,其中一個依賴于另外一個方面。將這兩者封裝在獨(dú)立對對象中以使他們可以各自獨(dú)立地改變和復(fù)用。
- 當(dāng)一個對象的改變需要同時改變其他對象,而不知道具體有多少對象有待改變。
- 當(dāng)一個對象必須通知其他對象,而它又不能假定其他對象是誰。換言之,你不希望這些對象緊密耦合的。
- 優(yōu)點(diǎn):
- 目標(biāo)和觀察者之間的抽象耦合最少
- 支持廣播通信
到了這里,關(guān)于12.python設(shè)計(jì)模式【觀察者模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!