美文网首页
[GeekBand][C++设计模式]第一周作业

[GeekBand][C++设计模式]第一周作业

作者: 散夜霜 | 来源:发表于2017-03-19 23:43 被阅读0次
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++设计模式]第一周作业

      本文链接:https://www.haomeiwen.com/subject/nszvnttx.html