今天在看觀察者模式,發覺這個很適合大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"