18.观察者模式--Observer
2014-07-18 00:45
253 查看
原文地址:/article/7840308.html
Observer模式:
Observer模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。。Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。
Observer模式典型的结构图为:
![](http://img.blog.csdn.net/20130605174552359)
Observer模式的实现代码如下:
Observer模式:
Observer模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。。Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。
Observer模式典型的结构图为:
Observer模式的实现代码如下:
//Subject.h #ifndef _SUBJECT_H_ #define _SUBJECT_H_ #include <list> #include <string> 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<Observer* >* _obvs; }; class ConcreteSubject:public Subject { public: ConcreteSubject(); ~ConcreteSubject(); State GetState(); void SetState(const State& st); protected: private: State _st; }; #endif //~_SUBJECT_H_ // Subject.cpp #include "Subject.h" #include "Observer.h" #include <iostream> #include <list> using namespace std; typedef string state; Subject::Subject() { //在模板的使用之前一定要new,创建 _obvs = new list<Observer*>; } 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<Observer*>::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" #include <string> using 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" #include <iostream> #include <string> 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()<<endl; } void ConcreteObserverA::Update(Subject* sub) { _st = sub->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()<<endl; } void ConcreteObserverB::Update(Subject* sub) { _st = sub->GetState(); PrintInfo(); } //main.cpp #include "Subject.h" #include "Observer.h" #include <iostream> using namespace std; int main(int argc,char* argv[]) { 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; }Obesrver模式的实现要点是,第一一般subject类都是采用链表等容器来存放Observer对象,第二抽取出Observer对象的一些公共的属性形成Observer基类,而Subject中保存的则是Observer类对象的指针,这样就使Subject和具体的Observer实现了解耦,也就是Subject不需要去关心到底是哪个Observer对放进了自己的容器中.生活中有很多例子可以看做是Observer模式的运用,比方说,一个班有一个班主任(Subject),他管理手下的一帮学生(Observer),当班里有一些事情发生需要通知学生的时候,班主任要做的不是逐个学生挨个的通知而是把学生召集起来一起通知,实现了班主任和具体学生的关系解耦.
相关文章推荐
- 设计模式笔记 18. Observer 观察者模式(行为型模式)
- 设计模式18:Observer 观察者模式(行为型模式)
- 18.观察者模式(Observer Pattern)
- 【18】观察者模式(Observer Pattern)
- 设计模式18 - Observer 观察者模式
- 18.观察者模式--Observer
- 设计模式与泡mm的关系之Observer观察者模式及再思考
- 《设计模式精解》学习笔记(十三)------Observer(观察者)模式
- Java设计模式之Observer 观察者模式
- 观察者(Observer)模式
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 设计模式之Observer观察者模式
- C#设计模式-观察者observer模式实现
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 观察者(Observer)模式
- 设计模式学习笔记(二十一)——Observer观察者
- Java中的观察者模式(Observer)
- 观察者模式 Observer Pattern — 三国演义之超级间谍战 — 美女貂蝉的故事
- [导入]Observer观察者模式
- Observer pattern 观察者模式