設計模式:觀察者模式
阿新 • • 發佈:2020-12-01
觀察者模式:
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_; };