4

我使用公司不同组提供的第三方库(用 C++ 编写)遇到了这个问题。

在 Observer 的析构函数中,它将自己与其订阅的所有可观察对象分离,这部分对我来说很有意义。但是在 Observable 的析构函数中,它会检查 observable 是否有任何观察者仍在其订阅者列表中。如果是这样,则引发错误。

我将把它故意在析构函数中抛出错误的事实放在一边。有人可以尝试向我解释为什么 observable 不应该期望观察者能够活得更久,或者这只是一个糟糕的设计。如果这是一个糟糕的设计,当我们处于观察者比可观察者更长寿的情况下,有没有好的方法来处理它?

4

4 回答 4

6

如果 Observer 有指向 Observable 的指针(或引用),并且 Observable 被销毁,则该指针将无效。作者只是试图避免悬空引用。

我认为通常有三种解决方案。

一种是完全按照这段代码所做的事情,也许调用 abort() 而不是在析构函数中抛出异常。

另一种方法是让 Observable 的析构函数从任何观察者中注销。

最后一种是使用“智能指针”(例如,引用计数shared_ptr)来保证 Observable 比任何 Observer 都长。

于 2011-09-23T14:59:20.607 回答
0

这取决于上下文。我希望观察者模式的一个完全通用的实现能够支持删除观察到的对象,至少是可选的,但是有很多用途没有意义,并且可能是编程错误。一般来说,在 observable 完全销毁之前,它应该通知它的观察者它会销毁的事实;然后他们应该取消注册。这意味着在调用可观察注册表对象的析构函数时,应该没有注册的观察者。

于 2011-09-23T14:59:53.060 回答
0

我通常以相反的方式实现该模式——Observable 添加自己并将自己从 Observer 列表中移除。My Observer 存在于应用程序的整个生命周期中,而 Observables 通常只存在几秒钟。

于 2011-09-23T15:03:40.850 回答
-1

这只是糟糕的设计,没有任何东西可以保证 observable 会比它的所有观察者更长寿。

如果您可以访问 observable 的析构函数,请重写它,以便分离所有剩余的观察者。

于 2011-09-24T16:42:16.563 回答