"""
观察者模式(发布-订阅模式)
体现了一对多的依赖关系
多个观察者可以同时监听同一个主题,当主题有状态变更时,会通知所有的观察者进行更新
主题:包含观察者列表,添加和删除观察者方法,主题消息,通知方法
观察者:知道主题消息,根据主题消息变更的方法
应用:在一个对象变更的同时需要变更其他对象,且不知道有多少其他对象;一个抽象模型有2个方面,其中一个方面依赖另一个方面,
可以使用观察者模式将他们封装在独立的对象中使他们独立的变更和复用
"""
from abc import ABCMeta, abstractmethod
class Subject(object):
__metaclass__ = ABCMeta
def __init__(self):
pass
@abstractmethod
def notify(self):
pass
class Boss(Subject):
def __init__(self):
super(Boss, self).__init__()
self._observer_list = []
self._msg = None
def attach(self, observer):
self._observer_list.append(observer)
def remove(self, observer):
self._observer_list.remove(observer)
def notify(self):
for observer in self._observer_list:
observer.update()
@property
def message(self):
return self._msg
@message.setter
def message(self, msg):
self._msg = msg
def change_status(self, msg):
self._msg = msg
self.notify()
class Observer(object):
__metaclass__ = ABCMeta
def __init__(self):
pass
@abstractmethod
def update(self):
pass
class NBAObserver(Observer):
def __init__(self, name, subject):
super(NBAObserver, self).__init__()
self._name = name
self._subject = subject
def update(self):
print("{0},{1}赶快关掉".format(self._subject.message, self._name))
if __name__ == '__main__':
# 建个主题
boss = Boss()
# 建2个观察者
observer1 = NBAObserver("张三", boss)
observer2 = NBAObserver("李四", boss)
# 在主题中添加观察者列表
boss.attach(observer1)
boss.attach(observer2)
# 主题发布消息
boss.change_status("我胡汉三回来了")
观察者模式(python)
最新推荐文章于 2024-08-17 21:25:52 发布