observer(觀察者模式)
觀察者模式主要解決的問(wèn)題是:
- 多個(gè)類(lèi)對(duì)同一個(gè)數(shù)據(jù)的關(guān)注
適用于:
- 一個(gè)數(shù)據(jù)的多種展示方式
- 進(jìn)度條
-
等
觀察者接口定義
/**
* 觀察者接口
*/
class observerInterface
{
public:
virtual void showData(int n)=0;
~observerInterface(){}
};
觀察者實(shí)現(xiàn)1
/**
* 觀察者1
*/
class observerOne : public observerInterface
{
public:
virtual void showData(int n)
{
cout<<"觀察者1被通知虚汛,數(shù)據(jù)"<<n<<endl;
}
};
觀察者實(shí)現(xiàn)2
/**
* 觀察者2
*/
class observerTwo : public observerInterface
{
public:
virtual void showData(int n)
{
cout<<"觀察者2被通知苏章,數(shù)據(jù)"<<n<<endl;
}
};
模擬進(jìn)度條數(shù)據(jù)通知觀察者
/**
* 進(jìn)度條
*/
class dataDeal
{
protected:
//所有觀察者
std::list<observerInterface*> observers;
public:
void dealData()
{
for(int i=0; i<5; i++)
{
//通知所有觀察者
tellObserver(i);
}
}
void addObserver(observerInterface* ob)
{
observers.push_back(ob);
}
void removeObserver(observerInterface* ob)
{
observers.remove(ob);
}
void tellObserver(int i)
{
for(auto p : observers)
{
p->showData(i);
}
}
};
測(cè)試
#include <iostream>
#include <list>
using namespace std;
int main(int argc, char const *argv[]) {
dataDeal* dp = new dataDeal();
dp->addObserver(new observerOne());
dp->addObserver(new observerTwo());
dp->dealData();
return 0;
}