设计模式之观察者模式(C++实现)

来源:互联网 发布:伦敦爱乐乐团知乎 编辑:程序博客网 时间:2024/06/04 20:10

 观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

特点:

    1.观察者模式定义了对象之间一对多的关系。

    2.主题(也就是可观察者)用一个共同的接口来更新观察者。

    3.观察者和可观察者用松耦合的方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口

    4.有多个观察者时,不可以依赖特点的通知次序。

/************************************************UpdateBase.h可观察者基类*************************************************************/

#ifndef UPDATEBASE_H#define UPDATEBASE_H#include <vector>#include <iostream>using namespace std;class DatabaseBase;class UpdateBase{protected:  vector<DatabaseBase*> updateVec;int value;public:virtual void addData(DatabaseBase*) = 0;virtual void deleteData(DatabaseBase*) = 0;virtual void setValue(int) = 0;virtual int getValue() = 0;virtual void notify() = 0;};#endif
/**********************************************************Update.h可观察者子类*************************************************************/

#include "UpdateBase.h"#include "DatabaseBase.h"class Update :public UpdateBase{public:virtual void addData(DatabaseBase* v){updateVec.push_back(v);};virtual void deleteData(DatabaseBase* v){for(auto it = updateVec.begin();it!=updateVec.end();it++){if(*it == v){updateVec.erase(it);return;}}};virtual void setValue(int n){value = n;notify();};virtual int getValue(){return value;};virtual void notify(){for(auto it = updateVec.begin();it!=updateVec.end();it++){(*it)->handle_event();}};};

/************************************************DatabaseBase.h观察者类*************************************************************/

#ifndef DATABASEBASE_H#define DATABASEBASE_Hclass UpdateBase;class DatabaseBase{protected:UpdateBase * update;public:DatabaseBase(){};DatabaseBase(UpdateBase *v){update = v;};virtual void handle_event()=0;};#endif

/************************************************DatabaseA.h观察者子类*************************************************************/

#include "DatabaseBase.h"#include "UpdateBase.h"using namespace std;class DatabaseA : public DatabaseBase{public:DatabaseA(UpdateBase *v){update = v;}void handle_event(){cout<<"this value is "<<update->getValue()<<endl;};};

/************************************************DatabaseB.h观察者子类*************************************************************/

#include "DatabaseBase.h"#include "UpdateBase.h"using namespace std;class DatabaseB :public DatabaseBase{public:DatabaseB(UpdateBase *v){update = v;}void handle_event(){cout<<"this value is "<<update->getValue()<<endl;};};

/*****************************************************main.cpp实现文件*************************************************************/

#include "UpdateBase.h"#include "DatabaseBase.h"#include "DatabaseA.h"#include "DatabaseB.h"#include "Update.h"int main(){UpdateBase *update = new Update;DatabaseBase * datebaseA = new DatabaseA(update);DatabaseBase * datebaseB = new DatabaseB(update);update->addData(datebaseA);update->addData(datebaseB);update->setValue(100);getchar();return 0;};





0 0
原创粉丝点击