Design patterns 观察者模式-如何处理意外更改?

Design patterns 观察者模式-如何处理意外更改?,design-patterns,Design Patterns,什么样的机制用于更新对象。。。除非我们经常检查它是否改变,然后指示受试者/被观察者推动他的状态 我的意思是,例如,一个对象改变了状态,它应该如何处理这个变化,它应该简单地将自己标记为已经改变,但是我如何让观察者知道它已经改变,而不必总是检查我正在观察的对象是否已经改变。。。我们如何处理意外更改并从通知中消除它们 有整个回调的事情,事件监听器,等等。。。我使用它,但并不真正理解,我把它当作一个黑匣子使用,但我真的想知道更多关于这些机制的内部信息。基本上,观察者模式说有一个对象是其他对象感兴趣的对象

什么样的机制用于更新对象。。。除非我们经常检查它是否改变,然后指示受试者/被观察者推动他的状态

我的意思是,例如,一个对象改变了状态,它应该如何处理这个变化,它应该简单地将自己标记为已经改变,但是我如何让观察者知道它已经改变,而不必总是检查我正在观察的对象是否已经改变。。。我们如何处理意外更改并从通知中消除它们


有整个回调的事情,事件监听器,等等。。。我使用它,但并不真正理解,我把它当作一个黑匣子使用,但我真的想知道更多关于这些机制的内部信息。

基本上,观察者模式说有一个对象是其他对象感兴趣的对象。
比如说,我们有一个
Kid
对象,它具有
MathGrade
GeographyGrade
等属性。
现在,对象
母亲
父亲
主体
都对
孩子
对象属性的更改感兴趣。
他们基本上有两个选择:

  • 每天都去问
    孩子,问“你的
    数学等级
    改变了吗?”“你的
    地理等级
    改变了吗?”等等
    这种方法不是很有效

  • 他们只需对
    孩子
    -“好的,这是我的号码-如果你的
    MathGrade
    发生变化,请给我打电话。” 这本质上就是观察者模式:对对象的更改感兴趣的人将自己注册到该对象,并保证在发生更改时得到通知

  • 如果要回到编程世界,您将拥有一个
    IGradeObserver
    接口,它将声明一个
    MathGradeChanged(int-newGrade)
    GeographyGradeChanged(int-newGrade)
    函数。
    母亲
    父亲
    主体
    将实现
    IGradeObserver

    现在,
    Kid
    类将有一个
    IGradeObserver
    列表和一个
    RegisterObserver(IGradeObserver)
    方法

    现在,每当一个等级发生变化时,
    Kid
    类就会遍历其观察者列表,并通知他们该变化

    回调和事件侦听器是实现此模式的一种方法。
    我建议用谷歌搜索一下,我自己也找到了一些有趣的指南(,和)。
    我相信您也可以找到其他一些与您选择的编程语言相关的语言。

    祝你好运

    基本上,观察者模式表示有一个对象是其他对象感兴趣的对象。
    比如说,我们有一个
    Kid
    对象,它具有
    MathGrade
    GeographyGrade
    等属性。
    现在,对象
    母亲
    父亲
    主体
    都对
    孩子
    对象属性的更改感兴趣。
    他们基本上有两个选择:

  • 每天都去问
    孩子,问“你的
    数学等级
    改变了吗?”“你的
    地理等级
    改变了吗?”等等
    这种方法不是很有效

  • 他们只需对
    孩子
    -“好的,这是我的号码-如果你的
    MathGrade
    发生变化,请给我打电话。” 这本质上就是观察者模式:对对象的更改感兴趣的人将自己注册到该对象,并保证在发生更改时得到通知

  • 如果要回到编程世界,您将拥有一个
    IGradeObserver
    接口,它将声明一个
    MathGradeChanged(int-newGrade)
    GeographyGradeChanged(int-newGrade)
    函数。
    母亲
    父亲
    主体
    将实现
    IGradeObserver

    现在,
    Kid
    类将有一个
    IGradeObserver
    列表和一个
    RegisterObserver(IGradeObserver)
    方法

    现在,每当一个等级发生变化时,
    Kid
    类就会遍历其观察者列表,并通知他们该变化

    回调和事件侦听器是实现此模式的一种方法。
    我建议用谷歌搜索一下,我自己也找到了一些有趣的指南(,和)。
    我相信您也可以找到其他一些与您选择的编程语言相关的语言。

    祝你好运

    有很多不同的机制来跟踪对象的变化

    第一种选择是使用观察员。这意味着更改对象中数据的每个方法都会调用观察者。实际上,最好将其放在一个函数中,如下所示:

    class MyClass
       {
       public:
          void setValue(int value)
             {
             m_value = value;
             notifyObservers();
             }
       private:
          void notifyObservers()
             {
             for (auto it=m_observers.begin();it!=m_observers.end();++it)
                (*it)->notify(this);
             }
          std::list<Observer *> m_observers;
       };
    
    class MyClass
       {
       public:
          void setValue(int value)
             {
             m_value = value;
             ++m_version;
             }
          int getVersion() const
             {
             return m_version;
             }
       private:
          int m_version;
       };
    
    现在,其他类可以简单地请求版本号,并使用它查看自上次请求版本号以来是否已更改

    两种方法各有优缺点:

    • 在观察者机制中,更改可能很慢(因为您需要调用所有观察者),但可以保证所有观察者都会立即更新
    • 在版本号方法中,更改非常快,但是您依赖于其他类来定期查询您的类的更改

    在您的情况下,哪种机制最好取决于具体情况。如果在实践中发现这一点,最好根据情况混合使用。某些更改最好立即传播(例如在计算中),其他更改最好延迟(例如更新屏幕)。

    有许多不同的机制来跟踪对象的更改

    第一种选择是使用观察员。这意味着更改对象中数据的每个方法都会调用观察者。实际上