一、介绍

在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变的,例如,执行程序的流程大致如下:

  1. 检查代码的正确性;
  2. 链接相关的类库;
  3. 编译相关代码;
  4. 执行程序。

对于不同的程序设计语言,上述4个步骤都是不一样的,但是,它们的执行流程是固定的,这类问题的解决方案就是我们本章要讲的模板方法模式。

二、定义

定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

三、使用场景

  • 多个子类有公有的方法,并且逻辑基本相同时。

  • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。

  • 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

四、模板方法模式的UML类图

UML类图:

角色介绍:

  • AbstractClass:抽象类,定义了一套算法框架。

  • ConcreteClass1:具体实现类1。

  • ConcreteClass2:具体实现类2。

五、简单示例

模板方法实际上是封装一个固定流程,就像是一套执行模板一样,第一步该做什么,第二步该做什么都已经在抽象类中定义好。而子类可以有不同的算法实现,在框架不被修改的情况下实现某些步骤的算法替换,下面以打开计算机这个动作来简单演示一下模板方法。打开计算机的整个过程都是相对固定的,首先启动计算机电源,计算机检测自身状态没有问题时将进入操作系统,对用户进行验证之后即可登录计算机,下面我们使用模板方法来模拟一下这个过程:

抽象的 Computer

/*** 抽象的 Computer*/
public abstract class AbstractComputer {//下面是抽象方法,子类可以覆盖,不允许外部直接调用这些方法,所以用protected/*** 开启电源*/protected abstract void powerOn();/*** 检查硬件*/protected abstract void checkHardware();/*** 载入操作系统*/protected abstract void loadOS();/*** 登录*/protected abstract void login();//下面是钩子方法,声明并实现/*** 是否需要登录* * @return true为需要登录*/protected boolean isLogin(){return true;}//下面是模板方法,定义为final,子类不能覆盖此方法 /*** 启动计算机方法,步骤为开启电源、系统检查、加载系统、检查是否登录。*/public final void startUp(){System.out.println("--------开机 START--------");powerOn();checkHardware();loadOS();if(isLogin()){login();}System.out.println("-------- 开机 END --------");}}

Windows系统电脑(不需登录):

/*** Windows系统电脑*/
public class WindowsComputer extends AbstractComputer{@Overrideprotected void powerOn() {System.out.println("Windows电脑开启电源");}@Overrideprotected void checkHardware() {System.out.println("Windows电脑检查硬件");}@Overrideprotected void loadOS() {System.out.println("Windows电脑载入操作系统");}@Overrideprotected void login() {}@Overrideprotected boolean isLogin() {return false;//返回false,不需登录}}

Mac系统电脑(需登录):

/*** Mac系统电脑*/
public class MacComputer extends AbstractComputer{@Overrideprotected void powerOn() {System.out.println("Mac电脑开启电源");}@Overrideprotected void checkHardware() {System.out.println("Mac电脑检查硬件");}@Overrideprotected void loadOS() {System.out.println("Mac电脑载入操作系统");}@Overrideprotected void login() {System.out.println("Mac电脑登录");}}

调用:

public class Client {public static void main(String[] args) {AbstractComputer comp = new WindowsComputer();comp.startUp();comp = new MacComputer();comp.startUp();}
}

结果:

--------开机 START--------
Windows电脑开启电源
Windows电脑检查硬件
Windows电脑载入操作系统
-------- 开机 END --------
--------开机 START--------
Mac电脑开启电源
Mac电脑检查硬件
Mac电脑载入操作系统
Mac电脑登录
-------- 开机 END --------

六、Android源码中的模板方法模式

1、AsyncTask

在使用AsyncTask时,我们都知道把耗时操作放到doInBackground(Params… params)中,在doInBackground之前,如果想做一些初始化操作,可以把实现写在onPreExecute中,当doInBackground执行完后会执行onPostExecute方法,而我们只需要构建AsyncTask对象,然后执行execute方法。

2、Activity的生命周期

ActivityThread的main函数被调用后,依次执行Activity的onCreate、onStart、onResume函数,用户通常在Activity的子类中覆写onCreate方法,并且在该方法中调用setContentView来设置布局。

七、区别

  • 工厂方法是模板方法的一种特殊版本。

  • 策略模式和模板方法模式都是封装算法,一个用组合,一个用继承。

  • 策略模式和模板模式通常可以互相替换。它们都像试卷,策略模式是选择题,模板模式是填空题。

八、总结

模板方法模式用4个字概括就是:流程封装。也就是把某个固定的流程封装到一个final方法中,并且让子类能够定制这个流程中的某些或者所有步骤,这就要求父类提取公用的代码,提升代码的复用率,同时带来了更好的可扩展性。

优点:

  • 封装不变部分,扩展可变部分。

  • 提取公共部分代码,便于维护。

缺点:

  • 需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,此时,可结合桥接模式来进行设计。

Android设计模式之——模板方法模式相关推荐

  1. 一篇博客读懂设计模式之---模板方法模式

    设计模式之模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 简而言之就是:父类定义了骨架(调用哪些方法及其 ...

  2. 设计模式之模板方法模式详解

    设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...

  3. Java设计模式之模板方法模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. php templete什么意思,PHP设计模式之模板方法模式定义与用法详解

    本文实例讲述了PHP设计模式之模板方法模式定义与用法.分享给大家供大家参考,具体如下: 什么是模板方法模式 模板方法(Template Method)设计模式中使用了一个类方法templateMeth ...

  5. 【设计模式】模板方法模式(C#)

    [设计模式]模板方法模式 1.概述 背景 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某 ...

  6. 设计模式之模板方法模式(TemplateMethod)

    设计模式之模板方法模式 模板方法模式 代码实现 模式的应用 模板方法模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现 ...

  7. 【Java】设计模式之模板方法模式

    - 好记性不如烂笔头,特将设计模式之模板方法模式记录在我的小仓库. 文章目录 什么是模板方法模式 案例 什么是模板方法模式 简而言之就是一套算法可以适用于多个类,则进行的步骤汇总,让子类别在不改变算法 ...

  8. Carson带你学设计模式:模板方法模式(Template Method)

    前言 今天Carson来全面总结最常用的设计模式 - 模板方法模式. Carson带你学设计模式系列文章 Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南 Carson带你 ...

  9. C++设计模式之模板方法模式

    模板方法模式 设计模式的定义 模板方法模式详解 背景----柠檬茶和咖啡的的冲泡方式 代码实现咖啡和茶冲泡的类 整理相似点 进一步设计 总结一下 认识模板方法 测试一下 模板方法模式的优点 模板方法的 ...

最新文章

  1. KDD 2017奖项全公布,华人成最大赢家
  2. Bitdefender 服务器版安装程序官方下载
  3. 吴敏霞(为奥运冠军名字作诗)
  4. 016_SpringBoot整合MyBatis
  5. java自定义日志级别_自定义log4j日志级别
  6. 爬虫学习--豆瓣top250
  7. 基于html的日历系统_企业信息化—APS系统(5)选型评估实战 Z 产品
  8. 解决VS中无法使用scanf的问题
  9. linux命令收集录
  10. 冷室压铸机行业调研报告 - 市场现状分析与发展前景预测
  11. JS中的call()和apply()方法
  12. HttpClient 使用指南 - POST篇
  13. DB2数据库备份和恢复笔记
  14. Hive常用正则表达式
  15. 苹果手机上网很慢_手机信号满格,但网速却很慢?无非是这4种原因,看完你就知道了...
  16. 微信小游戏教程(三) 新手教程
  17. python爬取百度百科保存scv
  18. BootstrapTable之千分位分隔符设置
  19. python小游戏《孙悟空大战白骨精》 (循环的练习)
  20. 我个人制作的网页网站作品,自学网站制作,自学网页制作网页制作视频教程

热门文章

  1. 十字路口红绿灯plc程序_实例讲解红绿灯PLC程序设计方法
  2. Sharepoin学习笔记—架构系列--01 Sharepoint的网页(Page),网页解析(Parsing)与解析安全处理(Security)
  3. C# 有什么惊艳到你的地方?
  4. ABP入门系列(12)——如何升级Abp并调试源码
  5. sharepoint当流程流转到某个节点对文档进行水印操作
  6. 计算机投诉信英语作文,投诉信A Letter of Complaint
  7. 【BZOJ 3831】【Poi2014】Little Bird(单调队列优化dp)
  8. 【HDU - 4781】Assignment For Princess(图上构造)
  9. 【POJ - 2533】Longest Ordered Subsequence(四种方法解决最长上升子序列 含二分优化版本)
  10. 琴生不等式一般形式_001.二次函数、方程和不等式知识点