本文共 3515 字,大约阅读时间需要 11 分钟。
Observer模式要解决的问题:建立一个一(Subject)对多(Observer)的依赖关系,当“一”变化的时候,依赖这个“一”的多也能够同步改变
Subject.h
//Subject.h#ifndef _SUBJECT_H_#define _SUBJECT_H_#includeSubject.cpp#include
using namespace std;typedef string State;class Observer;class Subject{public: virtual ~Subject(); virtual void Attach(Observer* obv); virtual void Detach(Observer* obv); virtual void Notify(); virtual void SetState(const State& st) = 0; virtual State GetState() = 0;protected: Subject();private: list * _obvs;};class ConcreteSubject:public Subject{public: ConcreteSubject(); ~ConcreteSubject(); State GetState(); void SetState(const State& st);protected:private: State _st;};#endif //~_SUBJECT_H_
#include "Subject.h"#include "Observer.h"#includeObserver.h#include using namespace std;typedef string state;Subject::Subject(){ //在模板的使用之前一定要new,创建 _obvs = new list
;}Subject::~Subject(){ }void Subject::Attach(Observer* obv){ _obvs->push_front(obv);}void Subject::Detach(Observer* obv){ if (obv != NULL) _obvs->remove(obv);}void Subject::Notify(){ list ::iterator it; it = _obvs->begin(); for (;it != _obvs->end();it++) { //关于模板和iterator的用法 (*it)->Update(this); }}ConcreteSubject::ConcreteSubject(){ _st = '\0';}ConcreteSubject::~ConcreteSubject(){ }State ConcreteSubject::GetState(){ return _st;}void ConcreteSubject::SetState(const State& st){ _st = st;}
//Observer.h#ifndef _OBSERVER_H_#define _OBSERVER_H_#include "Subject.h"#includeObserver.cppusing namespace std;typedef string State;class Observer{public: virtual ~Observer(); virtual void Update(Subject* sub) = 0; virtual void PrintInfo() = 0;protected: Observer(); State _st;private:};class ConcreteObserverA:public Observer{public: virtual Subject* GetSubject(); ConcreteObserverA(Subject* sub); virtual ~ConcreteObserverA(); //传入Subject作为参数,这样可以让一个View属于多个的Subject。 void Update(Subject* sub); void PrintInfo();protected:private: Subject* _sub;};class ConcreteObserverB:public Observer{public: virtual Subject* GetSubject(); ConcreteObserverB(Subject* sub); virtual ~ConcreteObserverB(); //传入Subject作为参数,这样可以让一个View属于多个的Subject。 void Update(Subject* sub); void PrintInfo();protected:private: Subject* _sub;};#endif //~_OBSERVER_H_
//Observer.cpp#include "Observer.h"#include "Subject.h"#includemain.cpp#include using namespace std;Observer::Observer(){ _st = '\0';}Observer::~Observer(){}ConcreteObserverA::ConcreteObserverA(Subject* sub){ _sub = sub; _sub->Attach(this);}ConcreteObserverA::~ConcreteObserverA(){ _sub->Detach(this); if (_sub != 0) delete _sub;}Subject* ConcreteObserverA::GetSubject(){ return _sub;}void ConcreteObserverA::PrintInfo(){ cout<<"ConcreteObserverA observer.... "<<_sub->GetState()< GetState(); PrintInfo();}ConcreteObserverB::ConcreteObserverB(Subject* sub){ _sub = sub; _sub->Attach(this);}ConcreteObserverB::~ConcreteObserverB(){ _sub->Detach(this); if (_sub != 0) { delete _sub; }}Subject* ConcreteObserverB::GetSubject(){ return _sub;}void ConcreteObserverB::PrintInfo(){ cout<<"ConcreteObserverB observer.... "<<_sub->GetState()< GetState(); PrintInfo();}
#include "Subject.h"#include "Observer.h"#includeusing namespace std;int main(){ ConcreteSubject* sub = new ConcreteSubject(); Observer* o1 = new ConcreteObserverA(sub); Observer* o2 = new ConcreteObserverB(sub); sub->SetState("old"); sub->Notify(); sub->SetState("new"); //也可以由Observer调用 sub->Notify(); return 0;}
转载地址:http://pjvvi.baihongyu.com/