在软件构建过程中,我们需要为某些对象建立 一种“通知依赖关系” —-一个对象发(目标对象)的状态发生改变,所有依赖的对象(观察者对象)都将很好的得到通知。如果这样的依赖关系过于紧密。将使软件不能很好的抵御变化
使用面向对象技术 可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
实现进度条
朴素实现
class MainForm : public Form{
TextBox * txtFilaPath;
TextBox * txtFileNumber;
ProgressBar *progressBar;
public :
void Button_Click(){
string filePath = txtFilaPath->getText();
int number = atoi(txtFileNumber->getText());
FileSplitter splitter(filePath,number,progressBar);
splitter.split();
}
}
class FileSpliter{
string m_filePath;
int m_fileNumber;
ProgressBar *m_progressBar;
public:
FileSpliter(const string & filePath,int fileNumber,ProgressBar progressbar):
m_filePath(filePath),
m_fileNumber(fileNumber),
m_progressBar(progressbar){
}
void split(){
//1.读取大文件
//2.分批向小文件写入
for(int i = 0;i < m_fileNumber;i ++){
//..
if(m_progressBar != nullptr){
m_progressBar->setValue((i + 1) / m_fileNumber);
}
}
}
}
观察者模式实现
class MainForm : public Form, public IProgress{
TextBox * txtFilaPath;
TextBox * txtFileNumber;
ProgressBar *progressBar;
public :
void Button_Click(){
string filePath = txtFilaPath->getText();
int number = atoi(txtFileNumber->getText());
FileSplitter splitter(filePath,number);
ConsoleNotifier cn;
splitter.addIProgress(this);
splitter.addIProgress(this);
splitter.split(&cn);
}
virtual void Doprogress(float value){
progressBar->setValue(value);
}
}
class ConsoleNotifier : public IProgress{
public:
virtual void DoProgress(float value){
cout<<".";
}
}
//抽象接口
class IProgress{
string m_filePath;
public:
virtual void DoProgress(float value) = 0;
virtual ~IProgress(){
};
}
class FileSpliter{
string m_filePath;
int m_fileNumber;
// ProgressBar *m_progressBar; //通知控件
vector<IProgress *> m_iprogressVector; //抽象通知机制
public:
FileSpliter(const string& filePath,int fileNumber):
m_filePath(filePath),
m_fileNumber(fileNumber){
}
void add_IProgress(IProgress *iprogress){
m_iprogressVector.push_back(iprogress);
}
void remove_IProgress(IProgress *iprogress){
m_iprogressVector.remove(iprogress);
}
void add
void split(){
//1.读取大文件
//2.分批向小文件写入
for(int i = 0;i < m_fileNumber;i ++){
//..
float progressValue = (i + 1) / m_fileNumber;
onProgress(progressValue);
}
}
protected:
void onProgress(float value){
vector<IProgress *>::Iterator itor = m_iprogressVector.begin();
while(itor != m_iprogressList.end()){
(*itor)->DoProgress(value); //更新进度条
itor ++;
}
}
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168514.html原文链接:https://javaforall.cn