今天在看观察者模式,发觉这个很适合大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"