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
}
};
[GeekBand][C++设计模式]第一周作业
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 1.设计模式简介 课程目标 松耦合设计思想 面向对象设计原则 重构技法改善设计 GOF核心设计模式 设计模式 不断...
- Strategy模式 今天重点来介绍下Strategy模式。 作为三大经典“组件协作”模式之一的Strategy模...
- 1. 课程简介 本周开始进入到《C++设计模式》课程中。 A. 课程目标 a. 理解松耦合设计思想b. 掌握面向对...