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. 掌握面向对...