Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望
能够提供多种形式的表示 (例如以表格进行统计显示、 柱状图统计显示、 百分比统计显示等) 。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。
1 /////////////Subject.h///////////////////////////////////////////////////////////// 2 #pragma once 3 #include <string> 4 #include <list> 5 using namespace std; 6 class Observer ; 7 8 typedef string State ; 9 class Subject 10 { 11 public: 12 virtual ~Subject(); 13 virtual void Attach(Observer* obv); 14 virtual void Detach(Observer* obv); 15 virtual void Notify(); 16 virtual void SetState(const State& st) = 0 ; 17 virtual State GetState() = 0 ; 18 protected: 19 Subject(); 20 21 private: 22 list<Observer*>* _Obvs ; 23 }; 24 25 class ConcreteSubject : public Subject 26 { 27 public: 28 ~ConcreteSubject(); 29 ConcreteSubject(); 30 State GetState(); 31 void SetState(const State& st) ; 32 protected: 33 private: 34 State _st ; 35 };
1 //////////////////Observer.h//////////////////////////////////////////////////////// 2 #pragma once 3 #include <string> 4 using namespace std; 5 typedef string State ; 6 class Subject ; 7 8 class Observer 9 { 10 public: 11 virtual ~Observer(); 12 virtual void Update(Subject* sub) = 0 ; 13 virtual void PrintInfo() = 0; 14 State _st ; 15 protected: 16 Observer(); 17 18 private: 19 }; 20 21 22 class ConcreteObserverA : public Observer 23 { 24 public: 25 ~ConcreteObserverA(); 26 ConcreteObserverA(Subject* sub); 27 virtual Subject* GetSubject(); 28 void Update(Subject* sub); 29 void PrintInfo(); 30 protected: 31 private: 32 Subject* _sub ; 33 }; 34 35 class ConcreteObserverB : public Observer 36 { 37 public: 38 ~ConcreteObserverB(); 39 ConcreteObserverB(Subject* sub); 40 virtual Subject* GetSubject(); 41 void Update(Subject* sub); 42 void PrintInfo(); 43 protected: 44 private: 45 Subject* _sub ; 46 };
1 ////////////Subject.cpp////////////////////////////////////////////////////////////// 2 #include "Subject.h" 3 #include "Observer.h" 4 #include <list> 5 typedef string State ; 6 7 8 Subject::Subject() 9 { 10 _Obvs = new list<Observer*>();//在模板的使用之前一定要new 11 } 12 Subject::~Subject() 13 { 14 15 } 16 17 void Subject::Attach(Observer* obv) 18 { 19 _Obvs->push_front(obv); 20 } 21 void Subject::Detach(Observer* obv) 22 { 23 if (obv != NULL) 24 { 25 _Obvs->remove(obv); 26 } 27 } 28 void Subject::Notify() 29 { 30 list<Observer*>::iterator it = _Obvs->begin(); 31 for (;it != _Obvs->end(); it++) 32 { 33 (*it)->Update(this); 34 } 35 } 36 37 ConcreteSubject::~ConcreteSubject() 38 { 39 40 } 41 ConcreteSubject::ConcreteSubject() 42 { 43 _st = '