← 模式

观察者

12345678910111213141516171819202122232425262728293031323334#include <vector> #include <functional> class observer { public: virtual void notify() = 0; }; class observer_concrete : public observer { public: virtual void notify() override { } }; class subject { public: void register_observer(observer& o) { observers.push_back(o); } void notify_observers() { for (observer& o : observers) { o.notify(); } } private: std::vector<std::reference_wrapper<observer>> observers; };

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

在事件发生时通知通用的观察者对象。

描述

观察者模式允许将通用的观察者对象注册到目标对象上,并在特定事件发生时接收通知。

定义于第 17–34 行subject 类包含一个存储观察者引用的 std::vector(见第 33 行)。在本例中,观察者(也称为监听者)是实现了 observer 接口(第 4–8 行)的对象。register_observer 函数(第 20–23 行)将观察者添加到这个 std::vector 中,随后 notify_observers 函数(第 25–30 行)会通知这些观察者。

我们对 std::vector 的元素使用了 std::reference_wrapper第 33 行),因为标准容器要求其元素类型是可赋值的,而普通的引用类型不满足这个条件。

贡献者

  • Joseph Mansfield
  • Robbie Shade

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享