版权声明:转载请注明出处 https://blog.csdn.net/nk1212582/article/details/81213304
转载请注明出处 https://blog.csdn.net/nk1212582/article/details/81213304
定义
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
结构图
代码实现
class Subject:
def __init__(self):
self.m_observers = list()
def attach(self, obj):
self.m_observers.append(obj)
def detach(self, obj):
self.m_observers.remove(obj)
def notify(self):
for obj in self.m_observers:
obj.update()
class Observer:
def update(self):
raise NotImplementedError
class ConcreteSubject(Subject):
def __init__(self):
super().__init__()
self.m_state = 0
def setState(self, val):
self.m_state = val
self.notify()
def getState(self):
return self.m_state
class ConcreteObserver(Observer):
def __init__(self, concreteSubject, name):
super().__init__()
self.m_concreteSubject = concreteSubject
self.m_name = name
def update(self):
print("观察者{0}观察到的新状态是{1}".format(self.m_name, self.m_concreteSubject.getState()))
s = ConcreteSubject()
s.attach(ConcreteObserver(s, "X"))
s.attach(ConcreteObserver(s, "Y"))
s.setState(1)
其输出为:
观察者X观察到的新状态是1
观察者Y观察到的新状态是1
特点
解除耦合,让耦合的双方都依赖于抽象,而不依赖于具体,使得各自的变化都不会影响到另一边的变化
适用场景
当一个对象改变时,需要同时改变其他对象,尤其是当它还不知道有多少个对象有待改变时,应该考虑使用观察者模式