当前位置: 首页 > news >正文

设计模式之模版方法模式

前言

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

定义

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

动机

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

案例

        代码

// 版本1
class Application{
public:bool Step2(){//...}void 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{public:void Step1(){//...}void Step3(){//...}void Step5(){//...}
};// 版本2
class Application : public Library {
protected:virtual bool Step2(){//...}virtual void Step4() {//...}
};int main(){Library* pLib=new Application();lib->Run();delete pLib;}
}class Library{
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;
};

类图

        

总结

        “不要调用我,让我来调用你” 的反向控制结构是典型应用

        被模版方法调用的虚函数可以实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐设置为protected方法

相关文章:

  • 【Linux系列】CMA (Contiguous Memory Allocator) 简单介绍
  • 【QT Quick】基础语法:基础类与控件
  • 【分页】Spring Boot 列表分页 + javaScript前台展示
  • 程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养
  • Grafana链接iframe嵌入Web前端一直跳登录页面的问题记录
  • python自动更新chromedriver
  • swiper+fixed的错误,splice函数的使用,提取年月日substring
  • [每日一练]利用自连接实现数量查询
  • MySQL | excel数据输出insert语句
  • 第167天:应急响应-日志自动提取分析项目_ELK_Logkit_LogonTracer_Anolog等
  • 力扣随机一题——所有元音按顺序排序的最长字符串
  • 数据驱动农业——助力作物增产
  • 新书推荐——《Python贝叶斯深度学习》
  • 基于php的民宿预订管理系统
  • 计算机视觉学习---图像增强
  • [NodeJS] 关于Buffer
  • Android系统模拟器绘制实现概述
  • extract-text-webpack-plugin用法
  • js正则,这点儿就够用了
  • Making An Indicator With Pure CSS
  • Markdown 语法简单说明
  • ng6--错误信息小结(持续更新)
  • Promise面试题,控制异步流程
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • storm drpc实例
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue自定义指令实现v-tap插件
  • 初识MongoDB分片
  • 欢迎参加第二届中国游戏开发者大会
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 问题之ssh中Host key verification failed的解决
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​ArcGIS Pro 如何批量删除字段
  • ######## golang各章节终篇索引 ########
  • ###项目技术发展史
  • $forceUpdate()函数
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)windows配置JDK环境
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)SvelteKit教程:layout 文件
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转) ns2/nam与nam实现相关的文件
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .htaccess 强制https 单独排除某个目录
  • .Net FrameWork总结