관찰자 패턴(Observer): 일대다 종속 관계를 정의하여 여러 관찰자 개체가 특정 주제 개체를 동시에 모니터링할 수 있도록 합니다. 이 토픽 객체는 상태가 변경될 때 모든 관찰자 객체에 알리고 자동으로 업데이트되도록 합니다.
패턴 구현:
[code]//观察者抽象基类 class Observer{ public: virtual void Update(int) = 0; }; //主题、目标 class Subject{ public: virtual void Attach(Observer *) = 0; //重视 virtual void Detach(Observer *) = 0; //脱离 virtual void Notify() = 0; //通知 }; class ConcreateObserver: public Observer{ private: Subject *m_pSubject; //1.具体观察者,维护一个指向ConcreteSubject对象的引用2.存储有关状态,这些状态应与目标的状态保持一致 public: //3.实现Observer的更新接口以使自身状态与目标的状态保持一致 ConcreateObserver(Subject *pSubject): m_pSubject(pSubject){} void Update(int value){ std::cout << "ConcreateObserver get the update. New State: " << value << std::endl; } }; class ConcreateObserver2: public Observer{ private: Subject *m_pSubject; public: ConcreateObserver2(Subject *pSubject):m_pSubject(pSubject){} void Update(int value){ std::cout << "ConcreateObserver2 get the update. New State: " << value << std::endl; } }; //1.将有关状态存入各ConcreateObserver对象 //2.当它的状态发生改变时,向它的各个观察者发出通知 class ConcreateSubject: public Subject{ private: std::list<Observer *> m_ObserverList; int m_iState; public: void Attach(Observer *pObserver); void Detach(Observer *pObserver); void Notify(); void setState(int state){ m_iState = state; } }; void ConcreateSubject::Attach(Observer *pObserver){ m_ObserverList.push_back(pObserver); } void ConcreateSubject::Detach(Observer *pObserver){ m_ObserverList.remove(pObserver); } void ConcreateSubject::Notify(){ std::list<Observer *>::iterator it = m_ObserverList.begin(); while(it != m_ObserverList.end()){ (*it)->Update(m_iState); ++it; } }
클라이언트:
[code]int main(){ //Create Subject ConcreateSubject *pSubject = new ConcreateSubject(); //Create Observer Observer *pObserver = new ConcreateObserver(pSubject); Observer *pObserver2 = new ConcreateObserver2(pSubject); //Change the state pSubject->setState(2); //Register the observer pSubject->Attach(pObserver); pSubject->Attach(pObserver2); pSubject->Notify(); //Output: ConcreateObserver get the update. New State: 2 //ConcreateObserver2 get the update. New State: 2 //Unregister the observer pSubject->Detach(pObserver); pSubject->setState(3); pSubject->Notify(); //Output: ConcreateObserver2 get the update. New State: 3 delete pObserver; delete pObserver2; delete pSubject; }
위는 옵저버 패턴에 대한 C++ 디자인 패턴 간략 소개 내용입니다. PHP 중국어 넷(www.php.cn)을 주목해주세요!