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;
};
现在,其他类可以简单地请求版本号,并使用它查看自上次请求版本号以来是否已更改
两种方法各有优缺点:
- 在观察者机制中,更改可能很慢(因为您需要调用所有观察者),但可以保证所有观察者都会立即更新
- 在版本号方法中,更改非常快,但是您依赖于其他类来定期查询您的类的更改
在您的情况下,哪种机制最好取决于具体情况。如果在实践中发现这一点,最好根据情况混合使用。某些更改最好立即传播(例如在计算中),其他更改最好延迟(例如更新屏幕)。有许多不同的机制来跟踪对象的更改 第一种选择是使用观察员。这意味着更改对象中数据的每个方法都会调用观察者。实际上