觀察者模式
1、內容
定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於他的物件都得到通知並被自動更新。
觀察者模式又稱‘釋出-訂閱’模式
2、角色
抽象主題(Subject)
具體主題(ConcreteSubject)——釋出者
抽象觀察者(Observer)
具體觀察者(ConcreteObserver)——訂閱者
3、使用場景
當一個抽象模型有兩方面,其中一方面依賴於另一方面。將這兩者封裝在獨立物件中以使它們可以獨立地改變和複用。
當對一個物件的改變需要同時改變其他物件,而不知道具體有多少物件有待改變。
當一個物件必須通知其他物件,而它又不能假定其他物件是誰。換言之,你不希望這些物件是緊密耦合的
4、優點
目標和觀察者之間的抽象耦合最小
支援廣播通訊
5、缺點
多個觀察者之間互不知道對方存在,因此一個觀察者對主題的修改可能造成錯誤的更新。
6、程式碼示例
from abc import ABCMeta, abstractmethod
class Observer(metaclass=ABCMeta):
@abstractmethod
def update(self, notice):
pass
class Notice:
def __init__(self):
self.observers = [] # 記錄該主體的觀察者(訂閱者)
def attach(self, obs):
self.observers.append(obs)
def detach(self, obs):
obs.company_info = None
self.observers.remove(obs)
def notify(self):
for obj in self.observers:
obj.update(self)
class ManagerNotice(Notice):
def __init__(self, company_info=None):
super().__init__()
self.__company_info = company_info
@property
def company_info(self):
return self.__company_info
@company_info.setter
def company_info(self, info):
self.__company_info = info
self.notify()
class Manager(Observer):
def __init__(self):
self.company_info = None
def update(self, noti):
self.company_info = noti.company_info
notice = ManagerNotice()
alex = Manager()
wusir = Manager()
# print(alex.company_info)
# print(wusir.company_info)
notice.attach(alex)
notice.attach(wusir)
#
notice.company_info="公司執行良好"
#
print(alex.company_info)
print(wusir.company_info)
#
notice.detach(wusir)
#
notice.company_info="公司要破產了"
print(alex.company_info)
print(wusir.company_info)
複製程式碼