基本介绍

1.模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的模板。它的子类可以俺需要重写方法实现,但调用将以抽象类中定义的方式进行;

2.简单说,模板方法模式定义一个操作中的算法的骨架,而降一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤;

3.这些类型的设计模式属于行为型模式。

原理类图

角色及职责

模板模式主要是由抽象模板(Abstarct Template)角色和具体的模板(Concrete Template)角色组成。

1.抽象模板(Abstract Template): 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤;定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

2.具体模板(Concrete Template): 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

代码

以下将以不同事务放入冰箱为例

冰箱类

/** * 冰箱抽象类 * * @author Api * @DATA 2020/3/24 1:08 */public abstract class Refrigerator {    //把物品放入冰箱仅需要三步,第一步打开冰箱门,第二步把物品放进去,第三步关闭冰箱门    //必须定义为final,不允许子类进行重写    final void operating() {        openDoor();        putInto();        close();    }    //第一步打开冰箱门    private void openDoor() {        System.out.println("打开冰箱门");    }    //第二步把物品放入进冰箱    abstract void putInto();    //第三步关闭冰箱门    private void close() {        System.out.println("关闭冰箱门");    }}

大象具体实现类

/** * 大象,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Elephant extends Refrigerator {    @Override    void putInto() {        System.out.println("把大象放进去");    }}

猪具体实现类

/** * 猪,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Pig extends Refrigerator{    @Override    void putInto() {        System.out.println("把猪放进去");    }}

测试类

/** * 测试类 * * @author Api * @DATA 2020/3/24 1:07 */public class Client {    public static void main(String[] args) {        Refrigerator pig = new Pig();        pig.operating();        System.out.println("----------------------------------");        Refrigerator elephant = new Elephant();        elephant.operating();    }}

执行结果为

打开冰箱门把猪放进去关闭冰箱门----------------------------------打开冰箱门把大象放进去关闭冰箱门

钩子方法

在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事情,子类可以视情况要不要覆盖,该方法称为"钩子"。

代码

上述案例把猪和大象放入了冰箱,此时,我需要看一下它们的状况,并且不关冰箱门,步骤将忽略第二步和第三步

冰箱抽象类

/** * 冰箱抽象类 * * @author Api * @DATA 2020/3/24 1:08 */public abstract class Refrigerator {    //把物品放入冰箱仅需要三步,第一步打开冰箱门,第二步把物品放进去,第三步关闭冰箱门    //必须定义为final,不允许子类进行重写    final void operating() {        openDoor();        putInto();        if (hook()) {            close();        }    }    //第一步打开冰箱门    private void openDoor() {        System.out.println("打开冰箱门");    }    //第二步把物品放入进冰箱    abstract void putInto();    //第三步关闭冰箱门    private void close() {        System.out.println("关闭冰箱门");    }    //钩子方法,决定是否关闭冰箱门    public boolean hook() {        return true;    }}

具体的实现子类

/** * 大象,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Elephant extends Refrigerator {    @Override    void putInto() {        System.out.println("把大象放进去");    }}

具体的实现子类

/** * 猪,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Pig extends Refrigerator {    @Override    void putInto() {        System.out.println("把猪放进去");    }}

具体的实现子类

/** * 打卡冰箱门,不干任何事 * @author Api * @DATA 2020/3/24 1:31 */public class Watch extends Refrigerator {    //空实现    @Override    void putInto() {    }    @Override    public boolean hook() {        return false;    }}

测试类

/** * 测试类 * * @author Api * @DATA 2020/3/24 1:07 */public class Client {    public static void main(String[] args) {        Refrigerator pig = new Pig();        pig.operating();        System.out.println("----------------------------------");        Refrigerator elephant = new Elephant();        elephant.operating();        System.out.println("----------------------------------");        //仅打开冰箱门,不放事物,不关冰箱门        Refrigerator watch = new Watch();        watch.operating();    }}

执行结果

打开冰箱门把猪放进去关闭冰箱门----------------------------------打开冰箱门把大象放进去关闭冰箱门----------------------------------打开冰箱门

优缺点

优点

1.扩展性好,对不变的代码进行封装,对可变的进行扩展;

2.可维护性好,因为将公共代码进行了提取,使用的时候直接调用即可。

缺点

每一个不同的实现都需要一个子类来实现,导致类的个数增加,会使系统变得复杂。

使用场景

1.有多个子类共有逻辑相同的方法;

2.重要的、复杂的方法,可以考虑作为模板方法。

注意事项

为防止恶意操作,一般模板方法都加上 final 关键词!

模板设计模式_23种设计模式之模板设计模式相关推荐

  1. Java两种设计模式_23种设计模式(11)java策略模式

    23种设计模式第四篇:java策略模式 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这 ...

  2. java抽象工厂设计模式_23种经典设计模式的java实现_1_抽象工厂模式

    抽象工厂模式的适用: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想 ...

  3. 23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式。

    23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式. 1. 随处可见的模板模式 2. 暗含讲究的工厂方法模式 3. 单例模式隐含的坑你能看到第几层? 视频讲解如下,点击观看: [干货篇]23种 ...

  4. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  5. 五种常见的 PHP 设计模式

    设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 "四人 ...

  6. 五种常见的PHP设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 五种常见的PHP设计模式 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm ...

  7. 模板方法设计模式两种实现方案

    目录 1.模板方法设计模式 2.继承实现方案 3.依赖实现方案 3.1 spring-jdbc 中的 JdbcTemplate 3.2  阿里分布式事务框架Seata中的ExecuteTemplate ...

  8. python 设计模式 23种_python实现23种设计模式

    本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>--吴强 <Py ...

  9. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

最新文章

  1. stdio.h头文件中申明的基本函数
  2. 了解下RDF 都柏林核心元数据
  3. 如何下载指定版本的torchtext
  4. 3w最简单led灯电路图_12v延时关闭电路图大全
  5. Jquery判断元素是否隐藏:display属性状态值
  6. 软考网络工程师学习笔记4-局域网与城域网
  7. quartz的负载均衡
  8. Java Thread等待,通知和notifyAll示例
  9. 表单验证神器——jquery.validate插件
  10. linux怎样使用小米线刷工具,小米线刷工具推荐及使用教程
  11. 杭电OJ刷题指南(ACM)
  12. 芝麻授权 java调用_手机浏览器怎么调用支付宝进行用户授权呢?
  13. 麒麟Linux启动目录,优麒麟目录结构介绍 系统入门必备
  14. 服务器被黑客入侵了怎么办?
  15. 华人科学家量子计算机,华人科学家张首晟辞世 有望获得诺贝尔奖却成遗憾
  16. Python生成验证码图片及验证用户提交的验证码是否正确
  17. ElementUI之el-pagination样式修改(小三角、“前往”、页码数)
  18. 用原生JS和CSS3做一个有趣的cube相册
  19. SAP License:SAP常见问题与解决办法(汇总帖)
  20. 【后续还会补充】Sublime Text 4 常用插件安装及配置方法

热门文章

  1. AngularJ控制器
  2. JAVA 反射 动态获取类,并调用方法
  3. Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
  4. PowerDesigner模型设计1
  5. 微软Windows2003的正版安装序列号
  6. Android对话框的高级设置《二》设置对话框按钮的透明度和对话框的在屏幕上的显示位置
  7. 编译报错:make: *** No rule to make target (例如:starg.h)解决
  8. Ubuntu18.04之搜狗输入法
  9. Android连接管理的评分机制(WIFI,Ethernet,BT,移动数据
  10. Sensor 代码流程分析