# -*- coding:UTF-8 -*-
import abc
class Subject(metaclass=abc.ABCMeta):
def __init__(self):
self.__observers = []
def attach(self, observer):
self.__observers.append(observer)
def detach(self, observer):
self.__observers.remove(observer)
def notify(self):
for o in self.__observers:
o.update_state()
class Observer(metaclass=abc.ABCMeta):
def __init__(self):
self._subject_state = None
@property
def subject_state(self):
return self._subject_state
@subject_state.setter
def subject_state(self, value):
self.__subject_state = value
@abc.abstractmethod
def update_state(self):
pass
class ConcreteSubject(Subject):
def __init__(self):
super().__init__()
self.__subject_state = None
@property
def subject_state(self):
return self.__subject_state
@subject_state.setter
def subject_state(self, value):
self.__subject_state = value
class ConcreteObserver(Observer):
def __init__(self, subject=None, name=None):
super().__init__()
self.__observer_state = None
self.__subject = subject
self.__name = name
def update_state(self):
self.__observer_state = self.__subject.subject_state
print("观察者{}的新状态是{}".format(self.__name, self.__observer_state))
@property
def subject(self):
return self.__subject
@subject.setter
def subject(self, value):
self.__subject = value
if __name__ == "__main__":
s = ConcreteSubject()
s.attach(ConcreteObserver(s, "X"))
s.attach(ConcreteObserver(s, "Y"))
s.attach(ConcreteObserver(s, "Z"))
s.subject_state = "ABC"
s.notify()