觀察者模式應用比較廣泛,又被稱為「發布-訂閱」模式。它用來定義物件間一種一對多的依賴關係,當乙個物件的狀態發生變化時,所有依賴它的物件都得到通知並被自動更新。觀察者模式的角色有:抽象主題、具體主題(發布者)、抽象觀察者和具體觀察者(訂閱者)。
from abc importabcmeta, abstractmethod
#抽象的訂閱者
class observer(metaclass=abcmeta):
@abstractmethod
defupdata(self, notice):
""":param notice: notice類的物件
:return:
"""pass
#抽象的發布者:可以是介面,子類不需要實現,所以不需要定義抽象方法!
class
notice(object):
def__init__
(self):
self.observers =
defattach(self, obs):
defdetach(self, obs):
self.observers.remove(obs)
defnotice(self):
"""推送
:return:
"""for obs in
self.observers:
obs.updata(self)
#具體的發布者
class
staffnotice(notice):
def__init__
(self, company_info):
super().
__init__() #
呼叫父類物件宣告observers屬性
self.__company_info =company_info
@property
defcompany_info(self, ):
return self.__company_info
@company_info.setter
defcompany_info(self, info):
self.
__company_info =info
self.notice()
#具體的訂閱者
class
staff(observer):
def__init__
(self):
self.company_info =none
defupdata(self, notice):
self.company_info =notice.company_info
staff_notice = staffnotice('
初始化公司資訊')
staff1 =staff()
staff2 =staff()
staff_notice.attach(staff1)
staff_notice.attach(staff2)
#print(staff1.company_info) none
#print(staff2.company_info) none
staff_notice.company_info = '
假期放假通知!
(staff1.company_info)
(staff2.company_info)
staff_notice.detach(staff2)
staff_notice.company_info = '
明天開會!
(staff1.company_info)
(staff2.company_info)
"""假期放假通知!
假期放假通知!
明天開會!
假期放假通知!
"""
使用場景:當乙個抽象模型有兩個方面,其中乙個方面依賴另乙個方面。將這兩者封裝在獨立物件中以使它們可以各自獨立地改變和復用;當對乙個物件的改變需要同時改變其它物件,而不知道具體有多少物件待改變;當乙個物件必須通知其它物件,而它又不能假定其它物件是誰。換言之,你不希望這些物件是緊耦合的。優點:目標和觀察者之間的抽象耦合最小;支援廣播通訊。
行為模式(觀察者模式)
觀察者模式,也稱發布 訂閱模式,定義了乙個被觀察者和多個觀察者的 一對多的物件關係。在被觀察者狀態發生變化的時候,它的所有觀察者都會收到通知,並自動更新。觀察者模式通常用在實時事件處理系統 元件間解耦 資料庫驅動的訊息佇列系統,同時也是mvc設計模式中的重要組成部分。以下我們以訂單建立為例。當訂單建...
觀察者模式 行為
當物件間存在一對多關係時,則使用觀察者模式 observer pattern 比如,當乙個物件被修改時,則會自動通知依賴它的物件。觀察者模式屬於行為型模式。意圖 定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。主要解決 乙個物件狀態改變給其他物...
行為型模式 觀察者模式
物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。subject 抽象的主題,被觀察的物件,提供 attach 和detach observer 物件的介面。concretesubject 具體的被觀察物件,維持 concretesubject 狀態...