C++设计模式编程中的观察者模式使用示例
概述: 类图: 可以看出,在这个观察者模式的实现里有下面这些角色: 概念 实例 示例: #include<vector> #include<iostream> #include<string> using namespace std; class Subject; class Observer{ //观察者抽象类 public: virtual void update(Subject *base)=0; protected: Subject * _subject; }; class Subject{ //目标抽象类 public: string s1; //数据值,可以作为私有数据,然后定义一个借口去返回值,这里为了省事 int i1; //数据值 void regiObserver(Observer *obs){ _observer.push_back(obs); cout<<"已注册"<<endl; } void deleObserver(Observer *obs){ _observer.pop_back(); } void notify(){ //更新所有的观察者 vector<Observer *>::iterator it; for(it = _observer.begin(); it != _observer.end(); it++) (*it)->update(this); } private: vector<Observer *> _observer; //观察者容器 }; class FSubject:public Subject{ public: void set(string s,int i){ s1 = s; i1 = i; notify(); //通知观察者。主函数的执行顺序已经保证了所有的观察者都已经进入容器内 } }; class FObserver :public Observer{ //第一个观察者派生类 public: FObserver(Subject *base):Observer(){ _subject = base; _subject->regiObserver(this); } void update(Subject *base){ s1 = base->s1; i1 = base->i1; display(); } void display(){ cout<<"更新值,第一个n"<<s1<<endl; cout<<i1<<endl; } private: string s1; int i1; }; class SObserver:public Observer{ //第二个观察者派生类 public: SObserver(Subject * base){ _subject = base; _subject->regiObserver(this); } void update(Subject *base){ s1 = base->s1; i1 = base->i1; display(); } void display(){ cout<<"更新值,第二个n"<<s1<<endl; cout<<i1<<endl; } private: string s1; int i1; }; int main() { FSubject * sub = new FSubject; FObserver * one = new FObserver(sub); SObserver * two = new SObserver(sub); sub->set("ok",3); return 0; } 观察者中的update()作用是完成观察者需要完成的事,比如在上例中,去更新自身保存的副本值,然后并显示出来。 Observer类中有一个Subject指针非常重要,在观察者的派生类的构造函数,需要去把自身的this传递过去进行注册。 Observer中有和Subject同样的数据,也可以设置为局部变量,仅仅是完成观察者需要做的事就行,而不必存储。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |