观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
特点:
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_H
class 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;
};