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 方法来执行算法。

相关推荐
Han.miracle1 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
Le1Yu2 小时前
分布式事务以及Seata(XA、AT模式)
java
寒山李白3 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
无妄无望4 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科4 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20164 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋5 小时前
【word多文档docx合并】
java·word
@yanyu6666 小时前
idea中配置tomcat
java·mysql·tomcat
2501_916766546 小时前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat
RoboWizard6 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿