class MainForm :public Form, IProgress
{
private:
TextBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressbar;
TextBox* txtMethodSelect;
public:
void Button1_Click()
{
string file_path{ txtFilePath->getText() };
int split_number = atoi(txtFileNumber->getText());
int method_id = atoi(txtMethodSelect->getText());
FileSplitter splitter(file_path, split_number, method_id);
splitter.addIProgress(this);
splitter.Split();
splitter.removeIProgress(this);
}
virtual void DoProgress(double value)
{
progressbar->set_value(value);
}
};
class FileSplitter
{
private:
string filePath;
int fileNumber;
SplitterStrategy* strategy;
int methodID;
list<IProgress*> iprogress_list;
public:
FileSplitter(const string& fp, const int sn, const int id)
:filePath(fp), fileNumber(sn), methodID(id),strategy(ISplitter::CreateSplitter(id))
{}
~FileSplitter()
{
delete strategy;
for (typename list<IProgress*>::iterator itor{ iprogress_list.begin() }; itor != iprogress_list; ++itor)
delete itor;
}
void Split()
{
// 读取文件
// 检查分割算法
// 分割文件
for (int i{ 0 }; i < fileNumber; ++i)
{
strategy->DoSplit(filePath, i);
double progress = double(i + 1) / double(fileNumber);
onProgress(progress);
}
}
void addIProgress(IProgress* iprogress)
{
_iprogressList->push_back(iprogress);
}
void removeIProgress(IProgress* iprogress)
{
_iprogressList.remove(iprogress);
}
protected:
virtual void onProgress(float value)
{
for (typename list<IProgress*>::iterator itor{ _iprogressList.begin() }; itor != _iprogressList.end(); ++itor)
(*itor)->DoProgress(value);
}
};
class IProgress
{
public:
virtual void DoProgress(double value) = 0;
virtual ~IProgress() {}
};
class ISplitter
{
public:
SplitterStrategy* CreateSplitter(int MethodID)
{
switch (MethodID)
{
case 1:
return new SplitterMethod1();
break;
case 2:
return new SplitterMethod2();
break;
case 3:
return new SplitterMethod3();
break;
default:
return nullptr;
break;
}
}
};
class SplitterStrategy
{
public:
virtual void DoSplit(const string& filePath, int fileNumber) = 0;
virtual ~SplitterStrategy() {}
};
class SplitterMethod1 :SplitterStrategy
{
public:
virtual void DoSplit(const string& filePath, int fileNumber)
{
//分割算法1
}
};
class SplitterMethod2 :SplitterStrategy
{
public:
virtual void DoSplit(const string& filePath, int fileNumber)
{
//分割算法2
}
};
class SplitterMethod3 :SplitterStrategy
{
public:
virtual void DoSplit(const string& filePath, int fileNumber)
{
//分割算法3
}
};
网友评论