观察者模式:

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,派生出两个类。

 

posted on 2020-12-01 21:17  wulc++  阅读(73)  评论(0编辑  收藏  举报