首页 > 代码库 > Observer 模式
Observer 模式
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 = ‘\0‘; 44 } 45 State ConcreteSubject::GetState() 46 { 47 return _st ; 48 } 49 void ConcreteSubject::SetState(const State& st) 50 { 51 _st = st ; 52 }
1 ////////////Observer.cpp////////////////////////////////////////////////////////////// 2 #include "Observer.h" 3 #include "Subject.h" 4 #include <iostream> 5 using namespace std ; 6 Observer::Observer() 7 { 8 _st = ‘\0‘; 9 } 10 Observer::~Observer() 11 { 12 13 } 14 15 ConcreteObserverA::ConcreteObserverA(Subject* sub) 16 { 17 _sub = sub ; 18 _sub->Attach(this); 19 } 20 ConcreteObserverA::~ConcreteObserverA() 21 { 22 _sub->Detach(this); 23 if (_sub != NULL) 24 { 25 delete _sub ; 26 } 27 } 28 29 Subject* ConcreteObserverA::GetSubject() 30 { 31 return _sub ; 32 } 33 void ConcreteObserverA::PrintInfo() 34 { 35 cout<<"观察者A的到的通知:"<<_sub->GetState()<<endl; 36 } 37 38 void ConcreteObserverA::Update(Subject* sub) 39 { 40 _st = sub->GetState(); 41 PrintInfo(); 42 } 43 44 45 ConcreteObserverB::ConcreteObserverB(Subject* sub) 46 { 47 _sub = sub ; 48 _sub->Attach(this); 49 } 50 ConcreteObserverB::~ConcreteObserverB() 51 { 52 _sub->Detach(this); 53 if (_sub != NULL) 54 { 55 delete _sub; 56 } 57 } 58 Subject* ConcreteObserverB::GetSubject() 59 { 60 return _sub ; 61 } 62 63 void ConcreteObserverB::PrintInfo() 64 { 65 cout<<"观察者B的到的通知:"<<_sub->GetState()<<endl; 66 } 67 void ConcreteObserverB::Update(Subject* sub) 68 { 69 _st = sub->GetState(); 70 PrintInfo(); 71 }
1 /////////////main.cpp///////////////////////////////////////////////////////////// 2 #include "Subject.h" 3 #include "Observer.h" 4 #include <iostream> 5 using namespace std; 6 7 int main() 8 { 9 Subject* sub = new ConcreteSubject(); 10 Observer* o1 = new ConcreteObserverA(sub); 11 Observer* o2 = new ConcreteObserverB(sub); 12 13 sub->SetState("你获得一封邮件!"); 14 sub->Notify(); 15 sub->SetState("你的评论有新的回复!"); 16 sub->Notify(); 17 18 19 getchar(); 20 return 0 ; 21 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。