4. Observer / Event(观察者模式) C++
1. 动机(场景)
适用于观察者对象(可以有多个)在观察某个对象(目标对象)的状态,如果该对象的状态发生改变,观察者对象都将收到通知。
举个例子,当我们要做一个文件分割器(就是将一个大文件分割成指定大小的小文件),这时还需要一个界面。
//MainForm.cpp 界面类
class MainForm : public Form
{//大文件的路径TextBox* txtFilePath;//用户希望分割的文件个数TextBox* txtFileNumber;
public:void Button1_Click(){string filePath = txtFilePath->getText();int number = atoi(txtFileNumber->getText().c_str()); //文件分割对象FileSplitter splitter(filePath, number);spliter.split();}
};//FileSpliter.cpp 文件分割器类
class FileSpliter
{string m_filePath;int m_fileNumber;
public:FileSpliter(const string& filePath, int fileNumber):m_filePath(filePath),m_fileNumber(fileNumber){}void spliter(){//读取大文件...//分批次向小文件中写入for(int i=0; i < m_fileNumber; i++){//...}
};
上面这些是基础代码,有了界面和文件分割器,但这时会有一个需求,就是当文件分割时,需要在页面上显示分割的进度条,表示分割的进度。首先我们用一个最朴素的想法来实现。就是在界面类中加一个进度条。
//MainForm.cpp 界面类
class MainForm : public Form
{//大文件的路径TextBox* txtFilePath;//用户希望分割的文件个数TextBox* txtFileNumber;//新增 进度条ProgressBar* progressBar;
public:void Button1_Click(){string filePath = txtFilePath->getText();int number = atoi(txtFileNumber->getText().c_str()); //文件分割对象FileSplitter spli