1.Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变.
2.Observer Pattern 结构图
注:这里的目标Subject提供依赖于它的观察者Observer的注册(Attach)和注销(Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作(Notify)。观察者Observer则提供一个Update操作,注意这里的Observer的Update操作并不在Observer改变了Subject目标状态的时候就对自己进行更新,这个更新操作要延迟到Subject对象发出Notify通知所有Observer进行修改(调用Update)。
3.实现
1 #ifndef _SUBJECT_H_ 2 #define _SUBJECT_H_ 3 4 #include <list> 5 #include <string> 6 using namespace std; 7 8 typedef string State; 9 class Observer; 10 11 class Subject 12 { 13 public: 14 virtual ~Subject(); 15 virtual void Attach(Observer* obv); 16 virtual void Detach(Observer* obv); 17 virtual void Notify(); 18 virtual void SetState(const State& st) = 0; 19 virtual State GetState() = 0; 20 protected: 21 Subject(); 22 private: 23 list<Observer* >* _obvs; 24 }; 25 26 class ConcreteSubject:public Subject 27 { 28 public: 29 ConcreteSubject(); 30 ~ConcreteSubject(); 31 State GetState(); 32 void SetState(const State& st); 33 protected: 34 private: 35 State _st; 36 }; 37 38 #endif
1 #include "Subject.h" 2 #include "Observer.h" 3 #include <iostream> 4 #include <list> 5 6 using namespace std; 7 typedef string state; 8 9 Subject::Subject() 10 { 11 //****在模板的使用之前一定要new,创建 12 _obvs = new list<Observer*>; 13 } 14 Subject::~Subject() 15 { 16 17 } 18 void Subject::Attach(Observer* obv) 19 { 20 _obvs->push_front(obv); 21 } 22 void Subject::Detach(Observer* obv) 23 { 24 if (obv != NULL) 25 _obvs->remove(obv); 26 } 27 void Subject::Notify() 28 { 29 list<Observer*>::iterator it; 30 it = _obvs->begin(); 31 for (;it != _obvs->end();it++) 32 { //关于模板和iterator的用法 33 (*it)->Update(this); 34 } 35 } 36 ConcreteSubject::ConcreteSubject() 37 { 38 _st = '