Skip to content

Latest commit

 

History

History
125 lines (94 loc) · 2.05 KB

01.模板方法.md

File metadata and controls

125 lines (94 loc) · 2.05 KB

模板方法 Template Method

动机

软件构建过程中,对于某项任务,常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时出现。

模式定义

  • 定义一个操作中算法的骨架(稳定),而将一些步骤延迟(变化)到子类中
  • Template Method 使得子类可以不改变(复用)一个算法的结构,即可重定义(override 重写)该算法的某些特定步骤

代码

结构化软件设计流程

// 程序库开发人员
class Libary{
public:
    void Step1(){
        //...
    }

    void Step3(){
        //...
    }

    void Step5(){
        //...
    }
};

// 应用程序开发人员
class Application{
public:
    bool Step2(){
        //...
    }

    void Step4(){
        //...
    }
};

int main()
{
    Libary lib();
    Application app();

    lib.Step1();

    if(app.Step2()){
        lib.Step3();
    }

    for(int i = 0; i < 4; i++){
        app.Step4();
    }

    lib.Step5();

}

面向对象软件设计流程

// 程序库开发人员
class Libary{
public:
    void Run(){
        Step1();

        if(Step2()){    // 支持变化 ==> 虚函数的多态调用
            Step3();
        }

        for(int i = 0; i < 4; i++){
            Step4();    // 支持变化 ==> 虚函数的多态调用
        }

        Step5();
    }

    virtual ~Libary(){ }

protected:
    void Step1(){
        //...
    }

    void Step3(){
        //...
    }

    void Step5(){
        //...
    }

    virtual bool Step2() = 0;
    virtual void Step4() = 0;
};

// 应用程序开发人员
class Application : public Libary{
protected:
    bool Step2() override {
        //... 子类重写实现
    }

    void Step4() override {
        //... 子类重写实现
    }
};

int main()
{
    Libary* pLib = new Application();
    pLib->Run();

    delete pLib;
}

题目