模板模式Template Method

模板模式Template Method模板模式Template Method组件协作典型模式案例模式定义重要总结组件协作现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,”组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是两者之间协作时常用的模式典型模式Template MethodStrategyObserver / Event动机在软件构造过程中,对某一项任务,它常常有稳定的的整体操作骨架,但各个子步骤 却有很多改变的需求,或者由于固有的原因,(比如框架和应用之间的关系)而无法和任务的整体结构同时

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

组件协作

现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,”组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是两者之间协作时常用的模式

典型模式

  • Template Method
  • Strategy
  • Observer / Event

动机

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

如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或晚期实现需求?

案例

使用模板方法前

//程序开发人员
class Library
{ 
   
private:
public:
    void step1(){ 
   
        //..
    }
    void step3(){ 
   
        //..
    }
    void step5(){ 
   
        //..
    }
};

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

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

    lib.Step1();
    if(app.Step2()){ 
   
        lib.Step3();
    }
    for(int i = 0;i < 4;i ++){ 
   
        app.Step4();
    }

    lib.Step5();
}

使用模板方法后

//程序库开发人员
class Library
{ 
   
private:
public:
    //稳定 template method
    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 bool Step4() = 0;//变换
};


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

int main(){ 
   
    Library * Plib = new Application();
    lib-Run();
    delete Plib;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模式定义

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

重要总结

  • Template Method模式是一种非常基础的设计模式,再面向对象系统中有大量的应用,它用最简洁的机制(虚函数的多态),为很多应用程序框架提供了灵活的扩展点,是代码复用方面的实现结构。
  • 除了可以灵活应对子步骤的变换外,“不要调用我,让我来调用你”的反向控制结构Template Method的典型应用
  • 在具体实现方面,被Template Method调用的虚方法可以实现,也可以没有任何实现(抽象方法,纯虚方法)一般设置他们为protected方法。

笔记

  • 扩展点:继承+虚函数就是扩展
  • 反向控制结构“不要调用我,让我来调用你” –> library调用用户代码 晚绑定
  • 函数指针也是晚绑定机制
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168515.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • COM聚合技术中的QueryInterface

    COM聚合技术中的QueryInterface最近在看COM聚合技术时遇到一个关于QueryInterface的问题。在《COM技术内幕》和《COM原理与应用》中都是寥寥数句带过,看起来很易理解,我却看了许久才有所领悟。先说明一下,为了节省篇幅,对于一些约定俗成的代码和变量,下文不再进行说明,如内部组件指向外部组件的m_pUnknownOuter和外部组件指向内部组件的m_pUnknownInner等,这些内容在相关书籍都有描述。问题

    2022年7月21日
    12
  • 一、SpringBoot+MybatisPlus+P6spy环境搭建

    一、SpringBoot+MybatisPlus+P6spy环境搭建

    2021年7月12日
    87
  • 【数据结构】— kmp算法和strstr函数

    【数据结构】— kmp算法和strstr函数kmp算法和strstr函数注:现实生活中,字符串匹配在很多的应用场景里都有着极其重要的作用,包括生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测等等,至此诞生了很多的算法,那么我们今天就来探索这两种经典的算法。一、概念分析首先我们需要了解到什么是kmp算法和strstr函数概念如下:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R….

    2022年6月25日
    23
  • vscode css自动补全_vscode怎么运行html文件

    vscode css自动补全_vscode怎么运行html文件当我vscode新建html文件时,用!+table键结果发现毫无反应?嗯???[/手动黑人问号]万能的某度来了>>>>>>>>>>>>>>>>>第一步:进入设置界面,搜索seting.json第二步:配置seting.json文件: “emmet.trigg…

    2022年8月22日
    4
  • 从0到1搭建一款数据平台产品_全国大数据采集软件免费

    从0到1搭建一款数据平台产品_全国大数据采集软件免费大数据平台基础理论之数据集成篇。

    2022年9月17日
    2
  • ldd 命令介绍_ldr指令是什么意思

    ldd 命令介绍_ldr指令是什么意思1.在制作自己的发行版时经常需要判断某条命令需要哪些共享库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行;在Linux环境下通过ldd命令即可实现,在终端下执行:ldd/bin/ls//ldd命令通常使用”-v”或”–verbose”选项来显示所依赖的动态连接库的尽可能的详细信息。即可得到/bin/ls命令的相关共享库文件列表:libtermcap.so.2=>/lib/lib

    2022年5月3日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号