【python 类】【部分转发】设计模式 -- 观察者模式 (发布订阅)

今天在看观察者模式,发觉这个很适合大V与粉丝这种感觉,因为改变原版的链接 https://www.cnblogs.com/alex3714/p/5760582.html 代码,

变成大V与粉丝。

收获了以下:

1. @msg.setter 这个装饰器

2. 可以把self作为对象传递~~~以前还总是傻呼呼的值知道传递self.name这样的属性传递~~

  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"

猜你喜欢

转载自www.cnblogs.com/shuo-yang0459/p/10437682.html