参考自定义容器的C ++观察者模式

时间:2014-10-31 22:51:29

标签: c++ observer-pattern

我有一个自定义容器("主题"),许多其他类都会观察到它。更改容器后,在进行更改后会向所有观察者发送通知。例如,对于调整大小,流程视为

std::vector<double> vec;

void resize(size_t n)
{
    vec.resize(n);          //first resize
    notify(Event::RESIZE);  //afterwards inform observers about the resize event
}

现在,当我通过引用访问更改容器的元素时,我看不到明显的方法来执行通知:

double& operator[](size_t i)
{
    notify(Event::CHANGE_ELEMENT);  //no way to notify afterwards, so notify before
    return vec[i];
}

因此当我将元素更改为

containerObject[2] = 1.1;

观察员会收到有关旧状态的通知,该状态仅在通知之后更新。

是否有解决方法(除了使用setter方法)?

1 个答案:

答案 0 :(得分:1)

制作某种辅助类,只需将通知推送到破坏状态。

struct MyHelper
{
    //This is may be a friend of your container

    MyHelper(std::size_t index, MyCustomContainer& ref)
     : _index(index), _ref(ref)
    {  }

    ~MyHelper()
    { notify(Event::CHANGE_ELEMENT); }

    double& operator=(double rhs)
    { _ref._vec[_index] = rhs; }

private:
    std::size_t _index;
    MyCustomContainer _ref;
};

您可以在运营商中执行此操作:

MyHelper MyCustomContainer::operator[](size_t i)
{
    MyHelper m(i, *this);
    return m;

    // MyHelper Destructor called
}

试一试online