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 并实现必要的方法即可。

相关推荐
爱丽_几秒前
Pinia 状态管理:模块化、持久化与“权限联动”落地
java·前端·spring
luom010237 分钟前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
毕设源码-朱学姐44 分钟前
【开题答辩全过程】以 骨科术后营养餐推荐系统为例,包含答辩的问题和答案
java
丶小鱼丶1 小时前
数据结构和算法之【栈】
java·数据结构
希望永不加班1 小时前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring
liurunlin8881 小时前
HeidiSQL导入与导出数据
java
leaves falling1 小时前
有效的字母异位词
java·服务器·前端
我真会写代码1 小时前
Spring面试高频题:从基础到源码,通俗拆解+避坑指南
java·spring·面试
huaweichenai2 小时前
java的时间操作介绍
java·开发语言
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于SpringBoot+Vue的百货商品进出货平台为例,包含答辩的问题和答案
java·spring boot·后端