模板方法

  • Template Method
    • 特点:

      • 稳定的机构,但是子步骤有很多改变的需求。
      • 或者由于固有原因导致无法和任务的整体结构同时实现
    • 目的:

      在稳定结构的前提下,灵活实现变化或者晚期再来实现需求

Template Method

例子

  • 程序库开发人员
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Libaray{
    public:
    void Step1(){
    //
    }
    void Step3(){
    //
    }
    void Step5(){
    //
    }
    }
  • 应用开发人员
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class Application{
    public:
    bool Step2(){

    }
    void Step4(){

    }
    }

    int main(){
    Libaray lib();
    Application app();
    lib.Step1();

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

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

    lib.Step5();
    }

改进

  • 程序库开发人员

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    class Libaray{
    public:


    void run(){
    Step1();

    if(Step2()){
    Step3();
    }

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

    Step5();
    }

    virtual ~Library(){}
    protected:
    void Step1(){
    //
    }
    void Step3(){
    //
    }
    void Step5(){
    //
    }
    virtual bool Step2()=0;
    virtual void Step4()=0;
    }
  • 应用程序开发人员

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Application:public Libaray{
    protected:
    bool Step2(){

    }
    void Step4(){

    }
    }

    int main(){
    Library* pLib = new Application();
    pLib->run();
    delete pLib;
    }

区别

  • Application call Library 早绑定
  • Library call Application 晚绑定

定义

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

UML 表示

模板方法UML

要点

  • Template Method 模式,是一种非常基础的设计模式,他用最简洁的机制(虚函数)为很多应用程序框架提供了灵活的扩展点,是代码结构实现复用
  • 除了可以灵活对应子步骤的变化外,“不要调用我”,“让我调用你”的反向控制结构是Template Method的典型
  • 在具体实现方面,被Template Method 调用的虚函数可以有实现也可以没有实现(抽象方法,纯虚方法)他们设置为protected 方法。
    • 因为虚函数需要在一定的流程内使用才有意义。因此一般并不提供出去