Java设计模式-模板方法模式

文章目录

  • Java设计模式-模板方法模式
    • 0.前言
    • 1.模板方法原理
    • 2.模板方法模式中的角色
    • 3.模板方法模式的UML类图
    • 4.代码实现
    • 5.编码测试
    • 6.模板模式中的钩子方法
    • 7.小结

0.前言

模板方法模式(TemplateMethod Pattern):父类(抽象类)中定义处理流程的框架,在子类中实现具体处理。

1.模板方法原理

父类(抽象类)中只定义一些子类需要的抽象方法这些方法的调用步骤(在一个具体的方法中)。

子类实现了父类的抽象方法的具体处理过程。

也就是说,不同的子类虽然具体实现可以各不相同,但是有着一样的处理流程。

若还是觉得抽象的话,看下面这个具体的例子就知道了:

小明和小红都是程序员,每天都会:起床,吃饭,写代码,睡觉。

这相当于父类中的四个抽象方法,父类规定了这些方法的调用顺序为:起床,吃饭,写代码,睡觉。

但是呢:

小明(相当于程序员父类的子类)的具体实现为:8点起床,吃饭吃的外卖,写后端代码,11点睡觉。

小红(相当于程序员父类的子类)的具体实现为:7点起床,吃饭吃自己做的饭菜,写前端代码,10点睡觉。

虽然具体实现不一样,但是四个方法的处理流程是一样的。

注意:这个流程中也可以有具体处理过程一摸一样的方法,需在父类中以具体的方法体现。

比如:小明和小红每天都锻炼半小时,这样原本的程序员父类就有四个抽象方法:起床,吃饭,写代码,睡觉。两个具体的方法:锻炼半小时,处理过程(定义了方法调用顺序)。在处理过程这个具体的方法中,调用顺序为:起床,吃饭,写代码,锻炼半小时,睡觉。

后面的代码也会按照这个例子实现。

2.模板方法模式中的角色

抽象父类AbstractClass:负责定义所需使用的模板方法,可以是抽象方法,也可以有具体的方法。还需有一个具体方法来确定这些方法的调用顺序和一些其他的操作。

具体子类ConcreteClass:负责具体实现抽象父类的抽象方法。无需担心方法的调用和具体处理流程。

3.模板方法模式的UML类图

非常简单,就两个类:

4.代码实现

接下来,用代码模拟上述例子:

程序员父类(抽象父类)

/*** 模板方法模式* 程序员父类(抽象父类)* 4个抽象方法:起床,吃饭,写代码,睡觉* 2个具体的方法:锻炼半小时,处理过程*/
public abstract class Coder {public abstract void getup();//起床public abstract void eat();//吃饭public abstract void code();//写代码public abstract void sleep();//睡觉public void exercise(){System.out.println("锻炼半小时");}//模板(定义了各个方法的调用顺序和一些其他操作)public void TemplateMethod(){getup();eat();code();exercise();sleep();}
}

小明(具体实现类):

public class Ming extends Coder {@Overridepublic void getup() {System.out.println("8点起床");}@Overridepublic void eat() {System.out.println("吃饭吃的外卖");}@Overridepublic void code() {System.out.println("写后端代码");}@Overridepublic void sleep() {System.out.println("11点睡觉");}
}

小红(具体实现类)

public class Red extends Coder{@Overridepublic void getup() {System.out.println("7点起床");}@Overridepublic void eat() {System.out.println("吃饭吃自己做的饭菜");}@Overridepublic void code() {System.out.println("写前端代码");}@Overridepublic void sleep() {System.out.println("10点睡觉");}
}

5.编码测试

测试编码:

public class Test {public static void main(String[] args) {//模板方法模式System.out.println("模板方法模式测试\n");System.out.println("小明的一天*****");Coder ming = new Ming();ming.TemplateMethod();//执行模板方法System.out.println();//换行System.out.println("小红的一天*****");Coder red = new Red();red.TemplateMethod();//执行模板方法}
}

测试结果:

模板方法模式测试小明的一天*****
8点起床
吃饭吃的外卖
写后端代码
锻炼半小时
11点睡觉小红的一天*****
7点起床
吃饭吃自己做的饭菜
写前端代码
锻炼半小时
10点睡觉

可看到按照抽象父类指定的顺序执行,子类只管实现方法,而不管各方法调用顺序流程。

6.模板模式中的钩子方法

试想一下这个场景:小明今天放假了,不写代码。(假设上班就写代码,不上班就不写代码)

那要如何改进上述的模板模式呢?

修改如下:

添加一个是否需要工作的方法(注意是具体的方法,不是抽象方法,这样子类可以选择性的重写),返回值为布尔类型,用true代表需要写代码,false代表不需要写代码。在模板方法中在原本需要执行code()方法的地方加入判断语句即可。

这种在模板模式中抽象父类中,一个默认不做任何事,子类可以选择性重写的方法,称为钩子方法

具体编码如下:

public abstract class Coder {public abstract void getup();//起床public abstract void eat();//吃饭public abstract void code();//写代码public abstract void sleep();//睡觉public void exercise(){System.out.println("锻炼半小时");}//模板(定义了各个方法的调用顺序和一些其他操作)public void TemplateMethod(){getup();eat();if (isWork()){code();//上班就写代码,不上班不写代码}exercise();sleep();}//钩子方法:判断是否上班public boolean isWork(){return true;//设置默认值}
}

小明的类需要重写该方法,并且返回false。

public class Ming extends Coder {//不上班@Overridepublic boolean isWork() {return false;}@Overridepublic void getup() {System.out.println("8点起床");}@Overridepublic void eat() {System.out.println("吃饭吃的外卖");}@Overridepublic void code() {System.out.println("写后端代码");}@Overridepublic void sleep() {System.out.println("11点睡觉");}
}

测试代码不需要改变,测试结果为:

模板方法模式测试小明的一天*****
8点起床
吃饭吃的外卖
锻炼半小时
11点睡觉小红的一天*****
7点起床
吃饭吃自己做的饭菜
写前端代码
锻炼半小时
10点睡觉

可以看到,小明的一天就没有写代码了。而小红依然不变,而若小红也不需要写代码时,同样重写isWork()方法并返回false即可。

7.小结

使用场景:当要完成的一个过程它需要经过一系列步骤,而且一些步骤大致相同时,但其个别步骤实现可能不同,需要考虑模板方法模式。

优点:模板方法模式可以使 逻辑处理通用化,无需在每个类中写逻辑处理(如方法调用顺序),实现了代码复用。

Java设计模式-模板方法模式详解相关推荐

  1. java设计模式组合模式详解_《JAVA设计模式》之组合模式(Composite)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的:html 合成模式属于对象的结构模式,有时又叫作"部分--总体"模式.合成模式将对象 ...

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

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

  3. 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)

    模板方法模式 一.模板方法模式的概念和角色 (一).模板方法模式的概念 (二).模板方法模式的角色 二.模板方法模式的应用场景 三. 模板方法模式的代码示例 四.模板方法模式重构JDBC操作业务 五. ...

  4. Java设计模式 - 模板方法模式

    Java设计模式 - 模板方法模式 定义一个算法的骨架,并将一些步骤通过子类表达. UML图示 要点 1. 定义一个算法的骨架 - 建立一个抽象类 2. 将一些步骤通过子类表达 - 子类继承抽象类 赋 ...

  5. 设计模式——状态模式详解

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  6. 【设计模式】第十三章:模板方法模式详解及应用案例

    系列文章 [设计模式]七大设计原则 [设计模式]第一章:单例模式 [设计模式]第二章:工厂模式 [设计模式]第三章:建造者模式 [设计模式]第四章:原型模式 [设计模式]第五章:适配器模式 [设计模式 ...

  7. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  8. (九)模板方法模式详解(包含与类加载器不得不说的故事)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 模板方法模式,这是一个在许多 ...

  9. Java设计模式——模板方法模式【Template Method Pattern】

    一.引言 23种设计模式大概分为三大类: 5种(创建型模式):工厂方法模式.抽象工厂模式.单例模式.原型模式.建造者模式. 7种(结构型模式):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

最新文章

  1. 2019 ICPC Asia Nanjing Regional K.Triangle(求一个能将三角形分成两个面积相同的线段、计算几何)
  2. c语言实现将两个文件复制到一个文件里_Python中复制文件的9种方法
  3. 阻止计算机访问注册表,电脑怎么样防止注册表被强行的篡改,保护电脑安全
  4. HDU 2502 月之数(简单递推)
  5. jsp学习之路之实现一个用户信息页面并实现跳转到另外一个页面输出用户的相关信息
  6. 研究机构称iPhone 12 mini可能已停产 因销量不佳
  7. 编译XML-Parser报错
  8. 计算机打不开guest用户,Win10打不开guest账户怎么办?
  9. html适配手机 响应式,移动端适配(响应式)
  10. Sapphire应用场景剖析 | 基于行业首个隐私EVM构建DApp
  11. matlab特征值是空集,MATLAB中矩阵方程求解的实现
  12. iOS app中不能跳转到商店更新
  13. Waves.Exchange福利大放送: 投资赢Lambo Huracan或240,000 USDN
  14. 入行多年软件测试总结的经验
  15. 软件测试,自学3个月出来就是高薪工作?你以为还是2019年以前?
  16. 2017-2018-2 20179204《网络攻防实践》第二周学习总结
  17. 计数排序的应用与分析
  18. 如何使用Jmeter读写Excel文件实现接口自动化
  19. 【程序设计】Julia程序开发注意事项
  20. 成立游戏工作室必须具备哪些条件?

热门文章

  1. 水域智慧监测,水环境监测的全新革命!
  2. windows10下载链接
  3. 阿根廷绝杀尼日尼亚给我们互联网建站者带来什么启示?
  4. 北京大学计算机专业王腾,王腾-理论与应用地球物理研究所-北大地空学院
  5. hibernate MySQL 无法正确插入数据
  6. 单位工作制度牌展示_公司管理制度标牌样本
  7. Android修改系统默认输入法
  8. Mongodb 索引 对查询结果的排序
  9. JQuery获取扫描枪扫描的数据
  10. 如何不浪费时间-番茄工作法