观察者模式:
1、事件发布者
事件发布者下面是抽象出一个IPublisher基类,可以支持有多种不同类型的发布者;另外一种方式是可以把管理观察者的抽出作为一个类,事件发布者包含这个类即可(见类图)。
class IPublisher { public: virtual ~IPublisher(){}; virtual void AddObserver(IObserver *observer) = 0; virtual void DeleObserver(IObserver *observer) = 0; virtual void Notify() = 0; }; class Publisher : public IPublisher { public: virtual ~Publisher() {} void AddObserver(IObserver *observer) override {} void DeleObserver(IObserver *observer) override {} void Notify() override {}private: std::list<IObserver *> list_observer_; };
这里具体事件发布者Publisher里面重写了几个方法,并且维护一个list用来保存所有的观察者,其中Notify方法会调用到观察者的update方法。
2、观察者
class IObserver { public: virtual ~IObserver(){}; virtual void Update(const std::string &message_from_publisher) = 0; }; class Observer : public IObserver { public: Observer(Publisher &publisher) : publisher_(publisher) {}
virtual ~Observer() {}
void Update(const std::string &message_from_publisher) override {}void RemoveMeFromTheList() { subject_.DeleObserver(this); } private: Publisher &publisher_; };
这里观察者保存一个事件发布者,在添加或者移除自己的时候,调用的是事件发布者的add和delet。
3、类图
事件发布者Editor,用了一个类EventManager来管理观察者。观察者的基类EventListeners,派生出两个类。