行为型设计模式 - 观察者模式

  1. 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新;
  2. 观察者模式在以下情况适用:
    i. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
    ii. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁(不希望这些对象紧密耦合)。
行为型设计模式 - 观察者模式_第1张图片
class ObserverBase(object):  # 观察者基类
    def __init__(self):
        self._observerd_list = []

    def attach(self, observe_subject):
        if observe_subject not in self._observerd_list:
            self._observerd_list.append(observe_subject)
            print("[%s]已经将[%s]加入观察队列..." % (self.name, observe_subject))

    def detach(self, observe_subject):
        try:
            self._observerd_list.remove(observe_subject)
            print("不再观察[%s]" % observe_subject)
        except ValueError:
            pass

    def notify(self):
        for objserver in self._observerd_list:
            objserver.update(self)


class Observer(ObserverBase):
    def __init__(self, name):
        super(Observer, self).__init__()
        self.name = name
        self._msg = ''

    @property
    def msg(self):
        return self._msg

    @msg.setter
    def msg(self, content):
        self._msg = content    # 观察者msg被修改时会发出通知
        self.notify()


class GCDViewer(object):  # 共军被观察者
    def update(self, observer_subject):
        print("共军:收到[%s]消息[%s] " % (observer_subject.name, observer_subject.msg))


class GMDViewer(object):  # 国军被观察者
    def update(self, observer_subject):
        print("国军:收到[%s]消息[%s] " % (observer_subject.name, observer_subject.msg))


if __name__ == "__main__":
    observer1 = Observer("共军放哨者")
    observer2 = Observer("国军放哨者")
    gongjun1 = GCDViewer()
    guojun1 = GMDViewer()
    observer1.attach(gongjun1)
    observer1.attach(guojun1)
    observer2.attach(guojun1)
    observer1.msg = "\033[32;1m敌人来了...\033[0m"
    observer2.msg = "\033[31;1m前方发现敌人,请紧急撤离,不要告诉共军\033[0m"

你可能感兴趣的:(行为型设计模式 - 观察者模式)