3.10设计模式——Template Method 模版方法模式(行为型)

意图

定义一个操作中的算法骨架,而将一些步骤延迟到子类中,Template Method 使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

结构

  • AbstractClass(抽象类)定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各个步骤;实现模版方法,定一个算法的骨架,该模版方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
  • ConcreteClass(具体类)实现原语操作以完成算法中与特定子类相关的步骤。

适用性

  • 一次性实现一个算法不变的部分,并将可变的行为留给子类来实现
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。
  • 控制子类扩展。模版方法旨在特定点调用"hook"操作(默认的行为,子类可在必要时进行重定义扩展),这就只允许在这些点进行扩展。

代码示例

java 复制代码
// 抽象类 AbstractClass
abstract class AbstractClass {
    // 模板方法,定义算法的骨架
    public void templateMethod() {
        // 调用具体的原语操作
        operation1();
        // 调用定义在 AbstractClass 中的操作
        operation2();
        // 允许具体子类重定义的钩子操作
        if (hookMethod()) {
            operation3();
        }
    }

    // 原语操作1
    protected abstract void operation1();

    // 原语操作2
    protected void operation2() {
        System.out.println("AbstractClass 中的操作2");
    }

    // 钩子操作,具体子类可以选择性实现
    protected boolean hookMethod() {
        return true;
    }

    // 钩子操作的具体实现
    protected void operation3() {
        System.out.println("AbstractClass 中的操作3");
    }
}

// 具体类 ConcreteClass
class ConcreteClass extends AbstractClass {
    @Override
    protected void operation1() {
        System.out.println("ConcreteClass 中的操作1");
    }

    @Override
    protected void operation3() {
        System.out.println("ConcreteClass 中的操作3");
    }

    @Override
    protected boolean hookMethod() {
        return false;
    }
}

// 主类
public class Main {
    public static void main(String[] args) {
        AbstractClass abstractClass = new ConcreteClass();
        abstractClass.templateMethod();
    }
}

AbstractClass 是一个抽象类,它定义了模板方法 templateMethod,其中包含了算法的骨架。AbstractClass 中包含了原语操作1、操作2以及钩子操作。ConcreteClassAbstractClass 的具体子类,它重定义了原语操作1和操作3,并选择性地实现了钩子操作。在 main 方法中,创建了一个 ConcreteClass 实例,并调用了 templateMethod 方法来执行算法。

相关推荐
青w韵13 小时前
SpringBoot3.x 升级到 SpringBoot 4.x,JDK17升级到JDK21
java·后端·spring
vx_bisheyuange13 小时前
基于SpringBoot的经方药食服务平台
java·spring boot·后端·毕业设计
惊讶的猫14 小时前
nia500总结
java·spring·mybatis
Yu_Lijing14 小时前
基于C++的《Head First设计模式》笔记——模版方法模式
笔记·设计模式
奔跑吧 android14 小时前
【ubuntu24.04】【安装jdk】
java·开发语言
BUTCHER514 小时前
Java 启动服务时指定JVM(Java 虚拟机)的参数配置说明
java·开发语言·jvm
sheji341614 小时前
【开题答辩全过程】以 会议室场地预约系统为例,包含答辩的问题和答案
java
摇滚侠14 小时前
尚硅谷 Java 零基础全套视频教程,System、Runtime、BigDecimal、BigInteger、Random,笔记 151
java·开发语言·笔记
fo安方14 小时前
软考~系统规划与管理师考试——真题篇——章节——第5章 应用系统规划——解析版
java·运维·网络
阿杰真不会敲代码14 小时前
POI 讲解
java·spring boot