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

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

一、认识模板方法


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


结构:


抽象类

模板方法:定义了整个执行流程的骨架,按照顺序来调用其中的基本方法。

基本方法:已经实现了的在执行流程中的方法,基本类型如下

抽象方法:在抽象类中声明,由具体子类实现。

具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。

钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

具体类(继承抽象类):实现抽象类中所定义的抽象方法和钩子方法。



优缺点:


优点:封装了不变部分,扩展可变部分;在父类中提取了公共的部分代码,便于代码复用;抽象类中定义了部分抽象方法来让子类实现,子类可通过扩展方式增加相应的功能,符合开闭原则。

缺点:对于每一个不同的实现都要定义一个子类,导致类的个数增大,间接增加了系统实现的复杂度;提升了代码阅读的难度;若是抽象父类添加了新的抽象方法,那么所有的子类都要改一遍,这就又不符合开闭原则。

应用场景:


在servlet中的HttpServlet抽象类中的service()方法相当于模板方法,其中包含了各种请求方法(doGet、doPost)的调用,并且请求方法可以通过继承的方式来去实现,让开发者进行自定义操作。

需要引入servlet-apijar包。

SpringMVC中的AbstractController抽象类中的handleRequest()方法也相当与模板方法。其中包含了对请求方法的判断,该类中提供了一个抽象方法handleRequestInternal()让用户进行自定义。

需要引入spring-webjar包


二、实现模板方法


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



抽象类: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();//执行模板方法
    }
}




总结


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

相关文章
|
11天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
27 0
[Java]23种设计模式
|
27天前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
27天前
|
设计模式 Java
Java设计模式
Java设计模式
25 0
|
30天前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
26 0
|
30天前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
40 0
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
|
9天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
80 38
|
6天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
1天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
12 4
|
1天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
16 3