1. 程式人生 > 實用技巧 >設計模式:觀察者模式

設計模式:觀察者模式

觀察者模式:

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方法

2、觀察者

class IObserver {
 public:
  virtual ~IObserver(){};
  virtual void Update(const std::string &message_from_subject) = 0;
};

class Observer : public IObserver {
 public:
  Observer(Subject &subject) : subject_(subject) {}virtual ~Observer() {}void Update(const std::string &message_from_subject) override
{ message_from_subject_ = message_from_subject; PrintInfo(); } void RemoveMeFromTheList() { subject_.Detach(this); std::cout << "Observer \"" << number_ << "\" removed from the list.\n"; } void PrintInfo() { std::cout << "Observer \"" << this->number_ << "\": a new message is available --> " << this->message_from_subject_ << "\n"; } private: std::string message_from_subject_; Subject &subject_; static int static_number_; int number_; };