我使用公司中另一个小组提供的第三方库(用C ++编写)遇到了这个问题。
在Observer的析构函数中,它将自己从它所订阅的所有可观察对象中分离出来,这部分对我有意义。但是在Observable的析构函数中,它会检查observable是否有任何仍然在其订阅者列表中的观察者。如果是这样,则会抛出错误。
我要说的是它故意在析构函数中抛出一个错误。有人可以试着向我解释为什么观察者应该期望没有观察者比自己活得更久,或者这只是一个糟糕的设计。如果这是一个糟糕的设计,当我们遇到观察者超过观察者的情况时,是否有好的方法来处理它?</ p>
答案 0 :(得分:6)
如果Observer具有Observable的指针(或引用),并且Observable被销毁,则该指针将无效。作者只是试图避免悬挂引用。
我认为有三种常用的解决方案。
一个是完成这个代码所做的事情,也许是调用abort()而不是在析构函数中抛出异常。
另一种方法是让Observable的析构函数从任何观察者中取消注册。
最后一个是使用“智能指针”(例如,引用计数shared_ptr
)来保证Observable超过任何Observer。
答案 1 :(得分:0)
这取决于具体情况。我希望完全通用 实现观察者模式以支持删除观察到的 对象,至少可选,但有很多用途 没有意义,可能是编程错误。一般来说, 在可观察到的完全破坏之前,它应通知其观察者 它会破坏的事实;然后他们应该取消注册。意思是 到可观察的注册表对象的析构函数时 叫,应该没有注册观察员。
答案 2 :(得分:0)
我通常以相反的方式实现模式 - Observable自我添加并将自己从Observer的列表中移开。我的观察者生活在整个应用程序的整个生命周期中,而Observables通常会活几秒钟。
答案 3 :(得分:-1)
这只是糟糕的设计,没有什么可以保证观察者会比所有的观察者都活得更久。
如果您可以访问observable的析构函数,请重写它以便它将分离剩余的所有观察者。