设计模式之模板方法模式(Java实现)

前言

本篇博客是关于模板方法模式的实现,若文章中出现相关问题,请指出!

对应代码地址:Gitee(demo-exer/ java-Lear23designpatterns)Github(java-demo/ java-Lear23designpatterns)

所有博客文件目录索引:博客目录索引(持续更新)

一、认识模板方法

模板方法定义:定义一个操作中的算法骨架(执行骨架),并将算法的一些步骤延迟到子类中让开发者取实现,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

结构

  • 抽象类
    • 模板方法:定义了整个执行流程的骨架,按照顺序来调用其中的基本方法。
    • 基本方法:已经实现了的在执行流程中的方法,基本类型如下
      • 抽象方法:在抽象类中声明,由具体子类实现。
      • 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
      • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
  • 具体类(继承抽象类):实现抽象类中所定义的抽象方法和钩子方法。

image-20210319230011319

优缺点

  • 优点:封装了不变部分,扩展可变部分;在父类中提取了公共的部分代码,便于代码复用;抽象类中定义了部分抽象方法来让子类实现,子类可通过扩展方式增加相应的功能,符合开闭原则
  • 缺点:对于每一个不同的实现都要定义一个子类,导致类的个数增大,间接增加了系统实现的复杂度;提升了代码阅读的难度;若是抽象父类添加了新的抽象方法,那么所有的子类都要改一遍,这就又不符合开闭原则

应用场景

  1. servlet中的HttpServlet抽象类中的service()方法相当于模板方法,其中包含了各种请求方法(doGet、doPost)的调用,并且请求方法可以通过继承的方式来去实现,让开发者进行自定义操作。
    • 需要引入servlet-apijar包。
  2. SpringMVC中的AbstractController抽象类中的handleRequest()方法也相当与模板方法。其中包含了对请求方法的判断,该类中提供了一个抽象方法handleRequestInternal()让用户进行自定义。
    • 需要引入spring-webjar包


二、实现模板方法

demo见xyz.changlu.template包下代码:

image-20210319224252023

抽象类:AbstractTemplate

//抽象模板类
public abstract class AbstractTemplate {

    //一整套数据库查询方法(连接数据库、执行查询操作、关闭连接操作)
    public void templateMethod(){
        System.out.println("初始化操作");
        System.out.println("连接数据库操作");
        abstractMethod1();
        abstractMethod2();
        System.out.println("关闭连接操作");
    }

    public abstract void abstractMethod1();

    public abstract void abstractMethod2();
}
  • 其中定义了一个模板方法,对于一些非核心业务的流程直接已经帮你实现,而核心业务方法设置为指定的抽象方法,让开发者自己去实现。

具体抽象类:ConcreteTemplate

//具体模板类:实现具体的核心业务功能
public class ConcreteTemplate extends AbstractTemplate {
    @Override
    public void abstractMethod1() {
        System.out.println("执行query()查询操作");
    }

    @Override
    public void abstractMethod2() {
        System.out.println("执行update()更新操作");
    }
}
  • 实现了模板方法的两个抽象方法(即核心方法)。

测试程序:测试类Customer

//测试类
public class Customer {
    public static void main(String[] args) {
        AbstractTemplate template = new ConcreteTemplate();
        template.templateMethod();//执行模板方法
    }
}

image-20210319225048135



总结

模板方法模式常常用于定义一个执行过程骨架(使用一个抽象类包含一个具体方法,该方法中是相应的执行流程,并且还有个抽象方法让开发者自定义),对于一些核心方法可以让开发者去继承该抽象类并实现方法。在框架的很多地方都使用到了该模式!!!简化了开发者许多不必要的操作,让开发者只需要专注于主要的业务开发即可!不过这样的话对于小白就不太友好了。



参考资料

视频:2020年最详细的23种Java设计模式完整视频教程全集 模板方法模式及实际框架应用

[1]. C语言中文网—模板方法模式(模板方法设计模式)详解


我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长路 ㅤ   

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值