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

相关推荐
APP 肖提莫几秒前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
kirito学长-Java2 分钟前
springboot/ssm太原学院商铺管理系统Java代码编写web在线购物商城
java·spring boot·后端
爱学习的白杨树3 分钟前
MyBatis的一级、二级缓存
java·开发语言·spring
Code成立13 分钟前
《Java核心技术I》Swing的网格包布局
java·开发语言·swing
中草药z19 分钟前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
信徒_27 分钟前
常用设计模式
java·单例模式·设计模式
神仙别闹32 分钟前
基于C#实现的(WinForm)模拟操作系统文件管理系统
java·git·ffmpeg
小爬虫程序猿33 分钟前
利用Java爬虫速卖通按关键字搜索AliExpress商品
java·开发语言·爬虫
组合缺一38 分钟前
Solon v3.0.5 发布!(Spring 可以退休了吗?)
java·后端·spring·solon
程序猿零零漆40 分钟前
SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法
java·spring cloud·mybatis-plus