zoukankan      html  css  js  c++  java
  • 观察者模式

    最近考试有考过几次,便仔细瞧瞧了这是何物。

    我理解其中核心的点就在于,当一个观察者观察到发生了改变,不仅他自身要进行更新,其余所有的观察者都将被通知到并进行更新。

    代码实现如下:

    from abc import ABCMeta, abstractmethod
    
    
    class Subject(object):
        def __init__(self):
            self.observers = []
            self._state = ""
    
        @property
        def state(self):
            return self._state
    
        @state.setter
        def state(self, value):
            self._state = value
            self.notify_all()
    
        def add_observers(self, observer):
            self.observers.append(observer)
    
    
        def notify_all(self):
            for observer in self.observers:
                observer.update(self.state)
    
    
    
    class Observer(metaclass=ABCMeta):
    
        def __init__(self, subject):
            subject.add_observers(self)
    
    
        @abstractmethod
        def update(self, state):
            """all observers must implement this function to become a observer"""
    
    
    
    class RainObserver(Observer):
        def __init__(self, subject):
            super().__init__(subject)
    
        def update(self, state):
            print(self.__class__.__name__, "had updated! now state: ", state)
    
    
    class SunObserver(Observer):
        def __init__(self, subject):
            super().__init__(subject)
    
        def update(self, state):
            print(self.__class__.__name__, "had updated! now state: ", state)
    
    
    if __name__ == '__main__':
        tmp_subject = Subject()
    
        RainObserver(tmp_subject)
        SunObserver(tmp_subject)
    
        tmp_subject.state = "Rain"
    
        

    输出:

    RainObserver had updated! now state:  Rain
    SunObserver had updated! now state:  Rain
  • 相关阅读:
    [UE4]创建多把枪,使用Class,参数的对象类型
    [UE4]换枪需要做的事,容器:数组、集合、Map
    [UE4]蓝图重构
    [UE4]为什么会有类型检查
    [UE4]ChildActor组件
    [UE4]Character,飞行模式。
    [UE4]Pawn和Controller,第一人称和第三人称切换
    [UE4]组件
    [UE4]Acotr
    [UE4]封装、继承、多态
  • 原文地址:https://www.cnblogs.com/xu-xiaofeng/p/13636501.html
Copyright © 2011-2022 走看看