java 设计模式 模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式非常适合于那些有一定公共流程,但某些步骤需要子类定制化的场景。
想学习springboot,springboot+vue项目,SpringCloudAlibaba的小伙伴,可以免费观看视频地址:

springcloudalibaba地址:

html 复制代码
https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source=14d27ec13a4737c281b7c79463687112

springboot地址:

html 复制代码
https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112

springboot+vue案例地址:

html 复制代码
https://www.bilibili.com/video/BV1JLSEYJETc/?vd_source=14d27ec13a4737c281b7c79463687112

模板方法模式的主要角色:

  1. 抽象类(Abstract Class):定义算法的框架和扩展点(即模板方法和钩子方法)。
  2. 具体实现类(Concrete Classes):实现抽象类中的抽象方法。

简单案例:制作饮料

假设我们有一个饮料店,提供两种饮料:咖啡和绿茶。制作这两种饮料的基本步骤是相似的,但某些步骤(比如添加的调料)有所不同。我们可以使用模板方法模式来定义一个通用的制作饮料流程,并允许每种饮料自定义特定的步骤。

1. 定义抽象类(Abstract Class)
java 复制代码
public abstract class Beverage {
    // 模板方法
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 钩子方法,子类可以覆盖此方法以返回不同的值
    public abstract boolean customerWantsCondiments();

    // 基本方法,子类可以覆盖,但通常不覆盖
    public void boilWater() {
        System.out.println("Boiling water");
    }

    public void brew() {
        System.out.println("Brewing the tea");
    }

    public void pourInCup() {
        System.out.println("Pouring into cup");
    }

    // 抽象方法,子类必须实现
    public abstract void addCondiments();
}
2. 创建具体实现类(Concrete Classes)
java 复制代码
public class Coffee extends Beverage {
    @Override
    public boolean customerWantsCondiments() {
        return true;
    }

    @Override
    public void brew() {
        System.out.println("Dripping coffee through filter");
    }

    @Override
    public void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

public class GreenTea extends Beverage {
    @Override
    public boolean customerWantsCondiments() {
        return false;
    }

    @Override
    public void brew() {
        System.out.println("Steeping green tea");
    }

    @Override
    public void addCondiments() {
        System.out.println("Adding lemon");
    }
}
3. 客户端代码
java 复制代码
public class Client {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();

        System.out.println("--------------------");

        Beverage tea = new GreenTea();
        tea.prepareRecipe();
    }
}

在这个案例中,Beverage 类定义了一个制作饮料的模板方法 prepareRecipe(),它规定了制作饮料的基本步骤。CoffeeGreenTea 类继承自 Beverage 类,并根据需要重写了 brew()addCondiments() 方法。客户端代码通过创建 CoffeeGreenTea 的实例,并调用它们的 prepareRecipe() 方法来制作饮料。

输出结果将展示两种饮料的制作过程,每种饮料都有其特定的步骤和调料。这个模式使得添加新的饮料类型变得非常容易,只需创建一个新的类继承自 Beverage 并实现必要的方法即可。

相关推荐
聪明的笨猪猪20 分钟前
Java Spring “IOC + DI”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
ThisIsMirror23 分钟前
CompletableFuture并行任务超时处理模板
java·windows·python
闲不住的李先森24 分钟前
乐观更新
前端·react.js·设计模式
珹洺1 小时前
Java-Spring入门指南(二十一)Thymeleaf 视图解析器
java·开发语言·spring
源码集结号1 小时前
一套智慧工地云平台源码,支持监管端、项目管理端,Java+Spring Cloud +UniApp +MySql技术开发
java·mysql·spring cloud·uni-app·源码·智慧工地·成品系统
EnCi Zheng1 小时前
Spring Security 最简配置完全指南-从入门到精通前后端分离安全配置
java·安全·spring
程序员小假1 小时前
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
java·后端
泉城老铁2 小时前
springboot实现对接poi 导出excel折线图
java·spring boot·后端
金銀銅鐵2 小时前
[Java] 如何自动生成简单的 Mermaid 类图
java·后端
纵横八荒3 小时前
Java基础加强13-集合框架、Stream流
java·开发语言