python版本的观察者模式

# -*- 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()

 

posted @ 2018-01-25 10:05  gjw  阅读(95)  评论(0)    收藏  举报