【python 類】【部分轉發】設計模式 -- 觀察者模式 (發佈訂閱)

今天在看觀察者模式,發覺這個很適合大V與粉絲這種感受,由於改變原版的連接 https://www.cnblogs.com/alex3714/p/5760582.html 代碼,html

變成大V與粉絲。python

 

收穫瞭如下:app

1. @msg.setter 這個裝飾器spa

2. 能夠把self做爲對象傳遞~~~之前還老是傻呼呼的值知道傳遞self.name這樣的屬性傳遞~~code

 

 

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 
  4 
  5 #
  6 # 觀察者(Observer)模式又名發佈-訂閱(Publish/Subscribe)模式
  7 # 當咱們但願一個對象的狀態發生變化,那麼依賴與它的全部對象都能相應變化(得到通知),那麼就能夠用到Observer模式, 其中的這些依賴對象就是觀察者的對象,那個要發生變化的對象就是所謂’觀察者’
  8 
  9 class ObserverBase(object):
 10     '''觀察者基類, 相似於 大V 帳戶'''
 11 
 12     def __init__(self):
 13         self._observerd_list = [] # 粉絲列表
 14 
 15     def attach(self, observe_subject):
 16         '''
 17         添加要觀察的對象, 添加粉絲
 18         :param observe_subject:
 19         :return:
 20         '''
 21         if observe_subject not in self._observerd_list:
 22             self._observerd_list.append(observe_subject)
 23             print("[%s]已經將[%s]加入觀察隊列..." % (self.name, observe_subject))
 24 
 25     def detach(self, observe_subject):
 26         '''
 27         解除觀察關係, 刪除粉絲
 28         :param observe_subject:
 29         :return:
 30         '''
 31         try:
 32             self._observerd_list.remove(observe_subject)
 33             print("再也不觀察[%s]" % observe_subject)
 34         except ValueError:
 35             pass
 36 
 37     def notify(self):
 38         '''
 39         通知全部被觀察者, 通知粉絲
 40         :return:
 41         '''
 42         # for objserver in self._observerd_list:
 43         #     objserver.update(self)
 44             # 粉絲.update(self)
 45         for fun_obj in self._observerd_list:
 46             fun_obj.by_notified(self)
 47 
 48 
 49 class Observer(ObserverBase):
 50     '''觀察者類, 實際的大V '''
 51 
 52     def __init__(self, name):
 53         super(Observer, self).__init__()
 54         self.name = name
 55         self._msg = ''
 56 
 57     @property
 58     def msg(self):
 59         '''
 60         當前情況
 61         :return:
 62         '''
 63         return self._msg
 64 
 65     @msg.setter
 66     def msg(self, content):
 67         """
 68         當 msg 這個屬性被設置的時候,執行的方法。
 69         :param content:
 70         :return:
 71         """
 72         self._msg = content
 73         self.notify()
 74 
 75 
 76 # class GCDViewer(object):
 77 #     '''
 78 #     共軍被觀察者, 粉絲A
 79 #     '''
 80 #
 81 #     def update(self, observer_subject):
 82 #         print("粉絲A:收到大V[%s]消息[%s] " % (observer_subject.name, observer_subject.msg))
 83 #
 84 #
 85 # class GMDViewer(object):
 86 #     '''
 87 #     國軍被觀察者, 粉絲B
 88 #     '''
 89 #
 90 #     def update(self, observer_subject):
 91 #         print("粉絲B:收到[%s]消息[%s] " % (observer_subject.name, observer_subject.msg))
 92 
 93 
 94 class FenViewer(object):
 95     """
 96     粉絲
 97     """
 98     def __init__(self, name):
 99         self.name = name
100 
101     def update(self, observer_subject):
102         print("粉絲[%s]:收到[%s]消息[%s] " % (self.name, observer_subject.name, observer_subject.msg))
103 
104     def by_notified(self, big_v_object):
105         print("粉絲[%s]:收到[%s]消息[%s] " % (self.name, big_v_object.name, big_v_object.msg))
106 
107 
108 if __name__ == "__main__":
109     big_v_1 = Observer("大V_1")
110     big_v_2 = Observer("大V_2")
111 
112     fen_a = FenViewer("粉絲A")
113     fen_b = FenViewer("粉絲B")
114 
115     big_v_1.attach(fen_a)
116     big_v_1.attach(fen_b)
117 
118     big_v_2.attach(fen_b)
119 
120     big_v_1.msg = "\033[32;1m官宣...\033[0m"
121 
122     big_v_2.msg = "\033[31;1m廣告推薦~~~\033[0m"
相關文章
相關標籤/搜索