/*
观察者继承基类,并实现其中的纯虚函数
在更新数据的类中存储了基类的指针,通过该指针就可以调用虚函数,进行显示
另一个类,给操作类传递参数,并调用该操作类的方法 添加\删除 观察者
*/
#include <iostream>
#include <list>
#include <windows.h>
using namespace std;
class IProgress {
public:
virtual void DoProgress(float progressing) = 0;
virtual ~IProgress(){}
};
class FilSpiliter {
list<IProgress*> Observer;
size_t fileLen;
public:
FilSpiliter(size_t len)
:fileLen(len)
{
}
void pilite() {
for (int i = 0; i < fileLen; ) {
//...
i += (fileLen) / 10;
cout << "copy..." << endl;
Sleep(100);
float Progress = ((i + 1) * 100 / fileLen) ;
doProgress(Progress);
}
}
void addObserver(IProgress* observer) {
Observer.push_back(observer);
}
void removeObserver(IProgress* observer) {
Observer.remove(observer);
}
void doProgress(float& progressing) {
for (auto i = Observer.begin(); i != Observer.end(); i++) {
(*i)->DoProgress(progressing);
}
}
};
class ConsoulNotifier : public IProgress{
public:
void DoProgress(float Progressing) {
for (int i = 0; i < Progressing; i++)
cout << "#";
cout << endl;
}
};
class ConsulNotifier2 : public IProgress {
public:
void DoProgress(float Progressing) {
for (int i = 0; i < Progressing; i++)
cout << ".";
cout << endl;
}
};
class MainForm : public IProgress {
ConsoulNotifier cn;
FilSpiliter fp;
ConsulNotifier2 cn2;
public:
MainForm(size_t fl)
:fp(fl)
{
fp.addObserver(this);
fp.addObserver(&cn);
fp.addObserver(&cn2);
fp.pilite();
fp.removeObserver(&cn);
fp.removeObserver(&cn2);
fp.pilite();
}
void DoProgress(float progressing) {
cout << progressing << "%" << endl;
}
};
int main() {
MainForm mf(1000);
getchar();
return 0;
}