觀察者模式
場景:
多個觀察者觀察一個目標對象的狀態,若該目標對象狀態發生改變,則觀察者會對此作出反應
實現:
目標對象:
1.狀態變量
2.觀察者列表
3.attach成員函數用於向觀察者列表中添加觀察者
4.detach成員函數,用於刪除觀察者列表中的觀察者成員
5.notify函數,用於當狀態變量發生變化時,通知觀察者
觀察者:
1.觀察者應該有多個,所以最好應該有一個抽象類
2.update成員函數,用於當目標對象狀態變量發生改變時,觀察者作出反應
優點:
任何時候,只要狀態變量發生改變,觀察者立刻就能發生改變
//代碼 //object.h #pragma once #include <list> #include "IObserver.h" class object { public: object(); ~object(); void attach(IObserver* observer); void detach(IObserver* observer); void notify(); void set_state(int state); private: std::list<IObserver*> m_list; int m_state; }; //object.cpp #include "pch.h" #include "object.h" object::object():m_state(0) { } object::~object() { } void object::set_state(int state) { m_state = state; } void object::attach(IObserver* observer) { m_list.push_back(observer); } void object::detach(IObserver* observer) { m_list.remove(observer); } void object::notify() { std::list<IObserver*>::iterator it = m_list.begin(); for (;it!=m_list.end();it++) { (*it)->update(m_state); } } //IObserver.h #pragma once #include <iostream> class IObserver { public: IObserver(); ~IObserver(); virtual void update(int state) = 0; }; class ObserverA :public IObserver { void update(int state); }; class ObserverB :public IObserver { void update(int state); }; //IOberser.vpp #include "pch.h" #include "IObserver.h" IObserver::IObserver() { } IObserver::~IObserver() { } void ObserverA::update(int state) { std::cout << "ObserverA:" << state << std::endl; } void ObserverB::update(int state) { std::cout << "ObserverB:" << state << std::endl; } //測試代碼 #include "pch.h" #include <iostream> #include "IObserver.h" #include "object.h" #ifndef SAFE_DELETE_POINTER #define SAFE_DELETE_POINTER(p){if(p) delete(p); (p)=NULL;} #endif int main() { object* v_object = new object; IObserver* observera = new ObserverA; IObserver* observerb = new ObserverB; v_object->set_state(23); v_object->attach(observera); v_object->attach(observerb); v_object->notify(); v_object->detach(observera); v_object->detach(observerb); SAFE_DELETE_POINTER(v_object); SAFE_DELETE_POINTER(observera); SAFE_DELETE_POINTER(observerb); getchar(); }
運行結果:
ObserverA:23
ObserverB:23