3-模板方法(Template-Method)

1. 动机 Motivation

  1. 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
  2. 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求

2. 结构化软件设计流程

/* 面向过程 结构化的语言-C */

//程序库开发人员
class Library{
public:
    void Step1(){
        //...
    }
    void Step3(){
        //...
    }
    void Step5(){
        //...
    }
};

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

int main(){
    Library lib();
    Application app();
    
    lib.Step1();
    
    if(app.Step2()){
        lib.Step3();
    }
    
    for(int index=0; index<4; ++index){
        app.Step4();
    }
    
    lib.Step5();
}

在这里插入图片描述

主流程在 Application 开发人员中

3. 面向对象软件设计流程

/* 面向对象 */

//程序库开发人员
class Library{
public:
    //稳定 template method
    void Run(){//算法的骨架
        void Step1();
        
        if(app.Step2()){//支持变化 ==> 虚函数的多态调用
        	Step3();
        }

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

        Step5();
    }
    //任何一个基类都要习惯性 写个 虚-析构函数
    virtual ~Library(){ }
    
protected:
    void Step1(){//稳定
        //...
    }
    void Step3(){//稳定
        //...
    }
    void Step5(){//稳定
        //...
    }
    
    virtual bool Step2() = 0; //变化
    virtual void Step4() = 0; //变化
};

//应用程序开发人员
class Application : public Library {
protected:
    virtual bool Step2(){
        //... 子类重写实现
    }
    virtual void Step4(){
        //... 子类重写实现
    }
};

int main(){
    Library* pLib = new Application();//多态指针
    lib->Run();
    
    delete pLib;
}

在这里插入图片描述

主流程在 Library 开发人员中

程序主流程,相对于 子步骤 更加稳定,更具有复用价值

4. 早绑定与晚绑定

在这里插入图片描述

从时间维度上来看,先有 Library,后有 Application

即,Library —— 早;Application —— 晚

  • 调用比自己"早"的代码 —— 早绑定(面向过程 结构化软件设计流程)
  • 调用比自己"晚"的代码 —— 晚绑定(面向对象软件设计流程)

“不要调用我,让我来调用你”
反向控制结构 —— 面向过程(结构化设计思维)和面向对象的区别

5. 模式定义

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

  • 设计模式中最核心的特点:稳定中有变化
  • 设计模式的前提是必须有至少一个稳定点,
    没有稳定点,设计模式没有作用。

设计模式最大的作用,就是 在变化和稳定之间 寻找隔离点,进行分离,从而来管理变化。“把变化像小兔子一样,关到小笼子里,让它在小笼子里面随便跳,而不至于把房间给污染掉”

一个正常的软件架构,既有变化点又有稳定点。

你需要有识别的能力,去分辨出软件代码中 哪些是变化的 哪些的稳定的

稳定的部分 更具有复用价值,变化的部分 更加灵活,
当然 稳定是相对而言的

6. 结构

在这里插入图片描述

  • 稳定的部分
    • TemplateMethod()
  • 变化的部分
    • PrimitiveOperation1()
    • PrimitiveOperation2()

7. 要点总结

  1. Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简单的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  2. 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
  3. 在具体的实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值