设计模式-模板方法模式

模板方法模式是一种行为设计模式 ,它使你能在抽象类中定义算法的框架,而将一些步骤的实现延迟到具体子类中。这种模式允许子类在不改变算法整体结构的情况下,重定义算法中的某些特定步骤。以下是模板方法模式的关键组成部分和应用场景:

1. AbstractClass(抽象类):

定义了一个或多个抽象方法,这些方法将在具体子类中实现。

包含一个模板方法,这是一个具体方法,它定义了算法的骨架,通常是一个操作序列。

抽象类中实现了大部分通用逻辑,而将可变部分通过抽象方法声明,由子类去实现。
2. ConcreteClass(具体类):

实现抽象类中声明的抽象方法,提供具体的实现。

继承抽象类并覆盖模板方法中定义的抽象操作,以此定制算法的特定部分。
3. 应用场景:

当有多个类实现相同算法,但实现细节有所不同时,可以使用模板方法模式来保持算法的统一结构。

在框架或库中,定义一套标准的处理流程,允许用户在特定点插入自定义行为。

当希望在父类中定义算法的结构,但允许子类改变算法的某些特定步骤,以实现扩展性。

在代码中,常见于各种"生成器"类,例如构建GUI事件处理、数据库操作流程等。包括AQS底层也使用了模板方法模式。

例如,在咖啡制作的例子中,抽象类Beverage可能有一个模板方法prepareBeverage(),它包含如下步骤:

加水

加糖(抽象方法,由具体咖啡或茶类实现)

加奶(抽象方法,由具体咖啡或茶类实现)

搅拌

子类如Coffee和Tea会实现加糖和加奶的具体方法,但整个制作流程保持一致。

java 复制代码
// 1. 抽象类(AbstractClass)
abstract class Beverage {
    // 步骤1:加水
    void addWater() {
        System.out.println("Adding water...");
    }

    // 步骤3:搅拌
    void stir() {
        System.out.println("Stirring the beverage...");
    }

    // 抽象方法:步骤2,不同的饮料有不同的添加成分
    abstract void addIngredients();

    // 模板方法:定义制作饮料的流程
    public final void prepareBeverage() {
        addWater();
        addIngredients();
        stir();
    }
}

// 2. 具体类(ConcreteClass)
class Coffee extends Beverage {
    // 实现咖啡的加料步骤
    @Override
    void addIngredients() {
        System.out.println("Adding coffee powder and sugar...");
    }
}

class Tea extends Beverage {
    // 实现茶的加料步骤
    @Override
    void addIngredients() {
        System.out.println("Adding tea leaves and sugar...");
    }
}

// 测试类
public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        // 制作咖啡
        Beverage coffee = new Coffee();
        coffee.prepareBeverage();

        // 制作茶
        Beverage tea = new Tea();
        tea.prepareBeverage();
    }
}

在这个例子中,Beverage是抽象类,定义了制作饮料的模板方法prepareBeverage() ,其中包含固定 的步骤(加水和搅拌)。addIngredients()是抽象方法 ,由具体的饮料类(Coffee和Tea)实现。当调用prepareBeverage()时,每个具体饮料类会根据其特点添加不同的成分。

相关推荐
Pniubi10 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko711 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师11 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.11 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼12 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说13 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐15 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
高晶15 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
const_qiu15 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog15 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友