【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)

🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏 《Spring 狂野之旅:底层原理高级进阶》 🚀

本专栏纯属为爱发电永久免费!!!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽http://suzee.blog.csdn.net/

目录

[深入理解设计模式之模板方法(Template Method)](#深入理解设计模式之模板方法(Template Method))

模板方法模式概述

模板方法模式的结构

模板方法模式的实现步骤

模板方法模式的应用场景

模板方法模式的优缺点

示例:使用模板方法模式实现数据访问


深入理解设计模式之模板方法(Template Method)

简介:

在软件开发中,设计模式扮演着重要的角色,它们提供了一种经过验证的解决方案,帮助我们解决常见的设计问题。而设计模式能够让我们的代码更加具有的兼容性和拓展性。本文将重点介绍设计模式中的模板方法(Template Method)模式,并探讨如何将其与Spring框架相结合,以实现灵活且可扩展的应用程序设计。

模板方法模式概述

模板方法模式是一种行为型设计模式,用于定义一个算法的骨架,将具体的实现延迟到子类中。模板方法模式允许我们定义一个抽象类,其中包含一个模板方法和一些抽象方法,供具体子类实现。这样,通用的操作被封装在模板方法中,而具体的实现细节则由子类来完成。

模板方法模式的结构

模板方法模式由三个核心组成部分构成:抽象类、具体类和模板方法。

抽象类(Abstract Class)扮演着模板方法模式的中心角色。它定义了模板方法,该方法提供了算法的骨架,并调用抽象方法和具体方法来完成操作。

具体类(Concrete Class)继承抽象类并实现其中的抽象方法,完成具体的实现细节。

模板方法(Template Method)是抽象类中定义的方法,它定义了算法的骨架。模板方法调用抽象方法和具体方法来完成操作,具体的实现延迟到具体类中。

模板方法模式的实现步骤

实现模板方法模式的步骤如下:

  1. 定义抽象类:创建一个抽象类,并在其中定义模板方法。模板方法提供算法的骨架,它调用抽象方法和具体方法来完成操作。

  2. 定义抽象方法:在抽象类中定义抽象方法,以供具体类实现。这些抽象方法表示算法中的可变部分。如下:这是一个商城项目的业务场景首先,定义抽象类AbstractShoppingCart,其中包含模板方法processOrder,以及抽象方法calculateTotalPricepay

    java 复制代码
    //定义抽象类AbstractShoppingCart,其中包含模板方法processOrder,以及抽象方法calculateTotalPrice和pay:
    abstract class AbstractShoppingCart {
        public final void processOrder() {
            addToCart();
            calculateTotalPrice();
            pay();
        }
    
        protected abstract void addToCart();
    
        protected abstract void calculateTotalPrice();
    
        protected abstract void pay();
    }
  3. 创建具体类:创建具体的子类,继承抽象类,并实现其中的抽象方法。具体类完成具体的实现细节。

  4. 重写模板方法:根据需要,在具体类中重写模板方法,或者新增特定步骤的方法。这样,可以根据具体需求来定制算法的实现。如下:创建具体类SuishiShoppingCart,继承AbstractShoppingCart,并实现其中的抽象方法:

    java 复制代码
    //然后,创建具体类SuishiShoppingCart,继承AbstractShoppingCart,并实现其中的抽象方法:
    class SuishiShoppingCart extends AbstractShoppingCart {
        protected void addToCart() {
            System.out.println("将商品加入购物车");
        }
    
        protected void calculateTotalPrice() {
            System.out.println("计算总价");
        }
    
        protected void pay() {
            System.out.println("完成支付");
        }
    }

最后,我们可以使用如下代码来测试和调用模板方法:

java 复制代码
public class Main {
    public static void main(String[] args) {
        AbstractShoppingCart shoppingCart = new SuishiShoppingCart();
        shoppingCart.processOrder();
    }
}

输出结果将会是:

java 复制代码
将商品加入购物车
计算总价
完成支付

在上述示例中,AbstractShoppingCart是抽象类,定义了模板方法processOrder,以及需要具体子类实现的抽象方法addToCartcalculateTotalPricepaySuishiShoppingCart是具体子类,继承抽象类并实现了抽象方法。在Main类中,我们创建了SuishiShoppingCart的实例,并调用processOrder方法来执行整个购物流程。

通过模板方法模式,我们可以将购物车的通用操作(加入购物车、计算总价、支付)封装在抽象类中,而具体的实现细节则由具体子类来实现。这样可以提高代码的复用性和可维护性

模板方法模式的应用场景

模板方法模式在许多场景下都有应用,包括:

  1. 框架和库的设计:模板方法模式常用于框架和库的设计中,它定义了框架的基本骨架,留下了一些可变的实现细节供使用者定制。

  2. 一次性实现一个算法的不变部分:模板方法模式允许我们将算法的不变部分放在父类中实现,而将可变部分留给子类来实现。这样,我们可以避免重复的代码,并提高代码的可维护性。

  3. 多个类具有相似的行为:如果多个类具有相似的行为,但其具体实现有所不同,我们可以将这些行为的共同部分提取到抽象类的模板方法中,而将变化的部分交给具体子类实现。

模板方法模式的优缺点

模板方法模式具有以下优点:

  1. 代码复用:模板方法模式提供了一种代码复用的方式,将通用的操作放在抽象类中实现,避免了重复编写相同的代码。

  2. 扩展性:通过定义抽象类和抽象方法,模板方法模式允许我们在不修改现有代码的情况下扩展算法的实现。只需创建新的具体类来实现抽象方法即可。

  3. 易于维护:模板方法模式将算法的骨架和具体实现分离,使代码结构更清晰。这样,当需求变化时,我们只需关注具体类的实现细节,而无需修改抽象类中的模板方法。

然而,模板方法模式也存在一些缺点:

  1. 对子类的限制:由于模板方法模式基于继承关系,子类必须遵循抽象类定义的算法骨架。这可能限制了子类的灵活性。

  2. 设计复杂性增加:使用模板方法模式会增加一定的设计复杂性。需要仔细考虑抽象类和具体类之间的关系,并确保模板方法和抽象方法的正确实现。

在与Spring框架结合使用时,模板方法模式可以更好地利用Spring框架的特性,例如使用Spring提供的模板类来实现通用的操作,同时允许我们通过子类来实现具体的业务逻辑。这种结合可以提供一种灵活且易于扩展的方式来开发应用程序。下面我们将通过一个示例来解释以上内容。

示例:使用模板方法模式实现数据访问

假设我们正在开发一个基于Spring框架的数据访问模块,其中包含对不同数据库的访问操作。我们可以使用模板方法模式来实现通用的数据库访问操作,并将特定的操作留给具体子类实现。

首先,我们创建一个抽象类AbstractDataAccess作为模板类,其中定义了模板方法execute

java 复制代码
public abstract class AbstractDataAccess {
    
    public void execute() {
        connect();
        performQuery();
        disconnect();
    }
    
    protected abstract void connect();
    
    protected abstract void performQuery();
    
    protected abstract void disconnect();
}

在抽象类中,我们定义了三个抽象方法:connectperformQuerydisconnect,它们表示数据库访问的可变部分。

然后,我们创建具体子类SqlServerDataAccessMySqlDataAccess,分别继承AbstractDataAccess并实现抽象方法:

java 复制代码
public class SqlServerDataAccess extends AbstractDataAccess {
    
    @Override
    protected void connect() {
        // SQL Server数据库连接逻辑
    }
    
    @Override
    protected void performQuery() {
        // SQL Server数据库查询逻辑
    }
    
    @Override
    protected void disconnect() {
        // SQL Server数据库断开连接逻辑
    }
}
java 复制代码
public class MySqlDataAccess extends AbstractDataAccess {
    
    @Override
    protected void connect() {
        // MySQL数据库连接逻辑
    }
    
    @Override
    protected void performQuery() {
        // MySQL数据库查询逻辑
    }
    
    @Override
    protected void disconnect() {
        // MySQL数据库断开连接逻辑
    }
}

在具体子类中,我们实现了各自数据库的连接、查询和断开连接的具体逻辑。

最后,我们可以在应用程序中使用这些具体子类来执行数据库访问操作:

java 复制代码
public class Main {
    
    public static void main(String[] args) {
        AbstractDataAccess dataAccess = new SqlServerDataAccess();
        dataAccess.execute();
        
        dataAccess = new MySqlDataAccess();
        dataAccess.execute();
    }
}

通过以上示例,我们可以看到模板方法模式的应用。抽象类AbstractDataAccess定义了数据库访问的模板方法execute,并将具体的连接、查询和断开连接的逻辑留给具体子类实现。

在应用程序中,我们可以根据实际需要选择具体的子类(如SqlServerDataAccessMySqlDataAccess)来执行数据库访问操作。这样,我们可以通过模板方法模式实现通用的数据库访问逻辑,并在具体子类中实现特定数据库的操作细节。

使用模板方法模式可以将通用的操作封装在抽象类中,提高代码的复用性和可维护性。同时,它也允许我们通过具体子类来扩展和定制算法的实现。在与Spring框架结合使用时,模板方法模式可以更好地利用Spring提供的特性和功能,实现灵活且可扩展的应用程序设计。

相关推荐
Michael_lcf几秒前
Java的UDP通信:DatagramSocket和DatagramPacket
java·开发语言·udp
摇滚侠9 分钟前
Spring Boot 3零基础教程,WEB 开发 HttpMessageConverter @ResponseBody 注解实现内容协商源码分析 笔记33
java·spring boot·笔记
计算机毕业设计小帅27 分钟前
【2026计算机毕业设计】基于Springboot的校园电动车短租平台
spring boot·后端·课程设计
调试人生的显微镜27 分钟前
Web前端开发工具实战指南 从开发到调试的完整提效方案
后端
静心观复27 分钟前
drawio画java的uml的类图时,class和interface的区别是什么
java·uml·draw.io
Java水解27 分钟前
【SQL】MySQL中空值处理COALESCE函数
后端·mysql
Laplaces Demon29 分钟前
Spring 源码学习(十四)—— HandlerMethodArgumentResolver
java·开发语言·学习
guygg8832 分钟前
Java 无锁方式实现高性能线程
java·开发语言
ss27334 分钟前
手写Spring第7弹:Spring IoC容器深度解析:XML配置的完整指南
java·前端·数据库
Python私教36 分钟前
DRF:Django REST Framework框架介绍
后端·python·django