0

0

在Java中如何使用抽象方法设计模板_JavaTemplateMethod设计解析

P粉602998670

P粉602998670

发布时间:2026-01-16 10:42:59

|

390人浏览过

|

来源于php中文网

原创

抽象方法必须定义在抽象类中且无方法体,不能被private、static或final修饰;模板方法模式核心是final模板方法定义算法骨架,抽象钩子方法供子类定制。

在java中如何使用抽象方法设计模板_javatemplatemethod设计解析

抽象方法必须定义在抽象类里,且子类必须实现

Java 中的 abstract 方法不能有方法体,也不能被 privatestaticfinal 修饰。它只声明行为契约,强制子类提供具体逻辑。

  • 如果父类含 abstract 方法,该类必须用 abstract class 声明,否则编译报错:error: abstract method in non-abstract class
  • 子类继承后,要么实现所有抽象方法,要么自己也声明为 abstract
  • 接口中也可以定义抽象方法(默认就是 public abstract),但模板方法模式通常依赖抽象类的继承链,所以优先用抽象类

模板方法模式的核心:final 模板方法 + 抽象钩子方法

模板方法模式不是靠“抽象方法”本身实现复用,而是靠一个 final 的非抽象方法(即模板方法)来定义算法骨架,再把可变步骤拆成 abstractprotected 钩子方法供子类定制。

abstract class DataProcessor {
    // 模板方法:定义流程,不可重写
    public final void process() {
        loadData();
        validateData();
        transformData();
        saveData();
    }

    // 这些是抽象钩子,由子类决定怎么执行
    protected abstract void loadData();
    protected abstract void validateData();
    protected abstract void transformData();
    protected abstract void saveData();
}
  • process()final 的——防止子类破坏整体流程顺序
  • 四个 protected abstract 方法是“空缺”,子类必须填;也可提供默认空实现(变成 protected void xxx() {}),让子类选择性覆盖
  • 注意访问修饰符:用 protected 而非 public,避免外部直接调用钩子方法破坏封装

常见错误:把模板方法也做成 abstract,或漏掉 final

有人误以为“模板方法”就该是抽象的,结果写出这样的代码:

CA.LA
CA.LA

第一款时尚产品在线设计平台,服装设计系统

下载
abstract class BadTemplate {
    // ❌ 错误:模板方法本身抽象,子类无法复用流程
    public abstract void execute(); 

    protected abstract void step1();
    protected abstract void step2();
}
  • 这样每个子类都要重写整个流程,完全失去“模板”的意义
  • 另一类错误是忘了加 final,导致子类可能覆盖 process(),绕过校验或跳过关键步骤
  • 还有一种隐蔽问题:在模板方法里调用了 this.xxx(),而 xxx() 是子类重写的非抽象方法——此时会触发子类版本(多态),但若子类还没初始化完,可能引发 NullPointerException

实际使用时,优先考虑组合优于继承

模板方法模式本质是基于继承的控制反转(IoC),但 Java 8+ 后更推荐用函数式接口 + 组合方式替代深度继承:

立即学习Java免费学习笔记(深入)”;

class DataProcessor {
    private final Supplier loader;
    private final Predicate validator;
    private final Function transformer;
    private final Consumer saver;

    public DataProcessor(Supplier loader,
                         Predicate validator,
                         Function transformer,
                         Consumer saver) {
        this.loader = loader;
        this.validator = validator;
        this.transformer = transformer;
        this.saver = saver;
    }

    public void process() {
        Data data = loader.get();
        if (validator.test(data)) {
            saver.accept(transformer.apply(data));
        }
    }
}
  • 这种方式更灵活,测试更容易(可传入 mock 函数),也不受单继承限制
  • 抽象类模板适合“强生命周期约束”的场景(如框架回调、资源必须按序初始化/销毁)
  • 真正需要模板方法的地方,往往是框架层(如 Spring 的 JdbcDaoSupport、JUnit 的 TestCase)——业务代码里过度使用容易导致类爆炸和紧耦合
抽象方法只是语法机制,模板方法模式的关键在于「流程固化 + 点位开放」。最容易被忽略的是:钩子方法的粒度设计——太粗(比如整个 transform())会让子类难以复用;太细(比如拆成 beforeTransform()doTransform()afterTransform())又让子类负担过重。得根据变化频率和正交性来权衡。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

2

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.8万人学习

Java 教程
Java 教程

共578课时 | 46.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号