模板方法设计模式的意图

设计一个框架,框架中整体步骤不可变,但是其中的有一些步骤是可变的,将可变的步骤放在不同的业务或者不同的模块对应的子类中来实现

举例

我们平时玩手机,我们可以将玩手机的过程分成以下几步:

1.手机开机

2.选择软件

3.使用软件

4.锁屏

上述玩手机的步骤假设是不变的,这4步中,只有第2,3步是可变的,而第1,4步是不可变的,那么就可以将整个步骤设计成一个框架,1,4步只需要在框架中提供一个借口,对应的实现放在子类中完成

代码如下

头文件templatemethod.h

#ifndef HEADFILE
#define HEADFILE#include <iostream>
#include <cassert>using namespace std;class playphone {
public:playphone();virtual ~playphone();void openphone();//不变步骤void lockscreen();//不变步骤void run();//整体框架不变protected:virtual void chooseapp()=0;//可变virtual void useapp()=0;//可变
};class openapp:public playphone
{
public:openapp(){cout<<__func__<<endl;}~openapp(){cout<<__func__<<endl;}virtual void chooseapp();//具体的可变步骤virtual void useapp();//具体的可变步骤
};#endif

源文件

templatemethod.cpp

#include "templatemethod.h"playphone::playphone()
{cout<<__func__<<endl;
}playphone::~playphone()
{cout<<__func__<<endl;
}void playphone::openphone()
{cout<<__func__<<endl;
}void playphone::lockscreen()
{cout<<__func__<<endl;
}void playphone::run()
{cout<<__func__<<endl;openphone();chooseapp();useapp();lockscreen();
}void openapp::chooseapp()//可变步骤的具体实现
{cout<<"choose weixin"<<endl;
}void openapp::useapp()//可变步骤的具体实现
{cout<<"use weixin"<<endl;
}

main.cpp

#include "templatemethod.h"int main(int argc, char const *argv[])
{playphone *instance=new openapp();instance->run();//运行框架delete instance;   instance=nullptr;return 0;
}

CMakeLists

cmake_minimum_required(VERSION 2.8)
project( templatemethod )
INCLUDE_DIRECTORIES(include)
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
add_executable(templatemethod ./src/templatemethod.cpp ./src/main.cpp )

运行结果

也就是说,可以看见,当用程序模拟玩手机的过程中,我们只需要在子类中修改chooseapp和useapp,就可以模拟出使用各种软件的过程,程序中模拟玩微信的过程,如果想使用别的软件,只要在chooseapp和useapp进行对应的修改即可,而不需要修改整个流程框架和其他的步骤,这也就是为什么我们在开发上层应用软件的时候,根本看不到main函数和整体框架,只看到某些模块文件,并且修改这些模块文件就能解决相应的问题,因为软件的整体框架和流程已经写好了,是不变的,只需要修改对应的某个步骤(可变的)即可,这就是模板方法设计模式。

参考:

https://www.bilibili.com/video/BV1kW411P7KS?p=3

《设计模式,可复用面向对象软件的基础》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

模板方法(设计一个稳定的父类框架,框架中的有一些步骤是可变的,将可变的步骤子类中来实现)相关推荐

  1. Dubbo面试 - 如何自己设计一个类似 Dubbo 的 RPC 框架?

    Dubbo面试 - 如何自己设计一个类似 Dubbo 的 RPC 框架? 面试题 如何自己设计一个类似 Dubbo 的 RPC 框架? 面试官心理分析 说实话,就这问题,其实就跟问你如何自己设计一个 ...

  2. 设计一个简易的引导任务框架(2) | 4.23粉丝赠书

    今天是4.23世界读书日,公众号向支持的小伙伴们送出下面3本技术图书(三选一)! 参与方式: 本文点赞留言,必须超过20字,以及你想要的图书名字参与活动 积赞最多的前3名读者,将会获得赠书,三选一 活 ...

  3. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    优知学院 2019-01-22 18:43:51 之前持续分享的几十期阿里Java面试题中,几乎每次必问Dubbo,比如:"如何从0到1设计一个Dubbo的RPC框架",其实主要考 ...

  4. 设计一个完善可用的服务框架

    一个完善可用的RPC服务框架,需要包含以下几点: 框架组成 具体功能说明 服务注册中心 服务框架基础知识 管理端 接口管理+配置中心 统一的RPC框架 监控中心+分布式追踪+服务治理+网关 管理端 1 ...

  5. python持久层框架_想设计一个Python的持久层框架

    框架定义在持久层,除提供ORMapping功能外加点权限控制.ORMapping的代码学习iBatis和ActiveRecord的做法,可使用任意一种,想象中xml应该这样子定义 select c1, ...

  6. Android设计一个图片加载框架

    本文不是具体编码去实现一个图片加载的框架,而是从理论上来讲解设计一个图片加载框架的注意事项和涉及的知识点,提供一个思路,或者帮助童鞋们应付面试.目前Android 发展至今优秀的图片加载框架太多,例如 ...

  7. 栈和队列之设计一个有getMin(得到最小值)功能的栈

    有2中方案,分别用类和内部类实现了 import java.util.Stack;/*** @author chenyu 第一种设计:* 题目:设计一个有getMin功能的栈,设计一个特殊的栈,在实现 ...

  8. fir1截止频率计算_如何快速设计一个FIR滤波器(二)

    一.理想低通滤波器单位脉冲响应是什么样 在如何快速设计一个FIR滤波器(一)中,我们介绍了一种简单设计FIR的方法--零极点法.这个方法非常简单,稍加培训,用笔和纸就能完成:当然缺点也很显而易见:零极 ...

  9. 高薪程序员面试题精讲系列127之如何设计一个消息队列?如何保证消息的执行顺序?

    一. 面试题及剖析 1. 今日面试题 如何保证消息队列中消息的执行顺序? RabbitMQ消息过期了怎么办? 如何设计一个消息队列? 如果让你自己设计一个消息队列,该怎么实现? 2. 题目剖析 壹哥在 ...

最新文章

  1. Android json请求格式与from表单格式
  2. 实战:基于OpenCV进行长时间曝光(内含彩蛋)
  3. 格灵深瞳CTO邓亚峰:AI学习的三种路线
  4. 迁移学习CNN图像分类模型 - 花朵图片分类
  5. Spring scope解惑
  6. 在JSP客户端限制表单重复提交
  7. go 使用sarama写入kafka数据时间戳问题
  8. nssl1452-排行榜【数论】
  9. java客户端作为kafka生产者测试
  10. Caffe的创始人贾扬清说,算法工程师将不存在?
  11. 使用jQuery创建模态窗口登陆效果
  12. Zephyr_Bindings目录作用
  13. Android进阶之利用Tablayout+ViewPager+Fragment实现神奇的滑动效果
  14. 【观点讨论与支撑】明星和成功人士真的就只有成功的一面吗?背后的心酸和痛苦的经历我感觉更重要!
  15. 【病毒分析】——熊猫烧香 专杀工具C源码
  16. java中的oop是什么意思_什么是面向对象编程(OOP)?
  17. EasyAR4.1平面识别
  18. iOS label的换行符\n
  19. 谢尔宾斯基三角形:Python+turtle
  20. 如何进行IT服务管理系统/IT运维管理系统/ITSM选型?

热门文章

  1. js 变量、函数提升
  2. poj 2492A Bug's Life(并查集)
  3. DDD 领域驱动设计-如何 DDD?
  4. Java对象表示方式2:XStream实现对对象的XML化
  5. 实例教程五:采用SharedPreferences保存用户偏好设置参数
  6. 小组级git服务器搭建
  7. nginx 0.8.x + PHP 5.2.13 胜过apache十倍的web服务器
  8. XGBoost输出特征重要性以及筛选特征
  9. JavaScript如何诞生
  10. 显示windows电脑上已连接过的wifi密码