【发布时间】:2017-01-23 19:02:09
【问题描述】:
到目前为止我所拥有的是:
观察者.h
class Observer
{
public:
~Observer();
virtual void Notify() = 0;
protected:
Observer();
};
class Observable
{
public:
~Observable();
void Subscribe( std::shared_ptr<Observer> observer );
void Unsubscribe( std::shared_ptr<Observer> observer );
void Notify();
protected:
Observable();
private:
std::vector<std::weak_ptr<Observer>> observers;
};
观察者.cpp
void Observable::Subscribe( std::shared_ptr<Observer> observer )
{
observers.push_back( observer );
}
void Observable::Unsubscribe( std::shared_ptr<Observer> observer )
{
???
}
void Observable::Notify()
{
for ( auto wptr : observers )
{
if ( !wptr.expired() )
{
auto observer = wptr.lock();
observer->Notify();
}
}
}
(de/constructors 在这里实现但为空,所以我把它们省略了)
我坚持的是如何实现取消订阅过程。我遇到了擦除 - 删除 - 结束习语,但我知道它不会在我设置 Observable 时“开箱即用”。如何检查观察者向量中的 weak_ptr 元素,以便删除所需的观察者?
我也在寻找一些关于我的 Un/Subscribe 程序的参数类型应该是什么的建议。使用std::shared_ptr<Observer>& 或const std::shared_ptr<Observer>& 会更好吗,因为我们不会对其进行修改?
我真的不想让 Observables 拥有他们的 Observers,因为这似乎背叛了该模式的意图,当然也不是我想要构建最终将使用该模式的项目的其余部分的方式。也就是说,我正在考虑增加一层安全/自动化是让 Observers 存储weak_ptr 的镜像向量。一个离开的 Observer 可以取消订阅它已经订阅的所有 Observable,一个离开的 Observable 可以从每个观察它的 Observer 中删除对自身的反向引用。在这种情况下,这两个班级显然是朋友。
【问题讨论】:
标签: c++ c++11 observer-pattern observers weak-ptr