設計模式(觀察者模式)

北京-IT拾荒者發表於2018-08-20

觀察者模式

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)

複製程式碼

設計模式(觀察者模式)

識別圖中二維碼,領取python全套視訊資料

相關文章