二十二、模板方法模式

  • 目的 : 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 核心 : 抽象类定义模板方法(包含算法骨架,由基本方法组成),基本方法可以是抽象方法(由子类实现)或具体方法/钩子方法(Hook Method,提供默认实现或扩展点)。
  • 场景 :固定流程,可变细节(如支付、审批);多个子类共享相似流程(如数据库操作、文件导出)。

首先是抽象基类,定义模板方法的框架

java 复制代码
package templatemethod;

public abstract class BaseTemplate {
	public abstract void part1();

	public abstract void part2();

	public abstract void part3();

	// 模板方法,定义算法骨架,使用final防止子类修改算法结构
	public final void useTemplateMethod(){   
		part1();
		part2();
		part3();
	}
}

然后第一个模板方法具体实现类

java 复制代码
package templatemethod;

public class TemplateMethod1 extends BaseTemplate {

    @Override
    public void part1() {
        System.out.println("模板1第一部分实现");
    }

    @Override
    public void part2() {
        System.out.println("模板1第二部分实现");
    }

    @Override
    public void part3() {
        System.out.println("模板1第三部分实现");
    }
}

第二个模板方法具体实现类

java 复制代码
package templatemethod;

public class TemplateMethod2 extends BaseTemplate {

    @Override
    public void part1() {
        System.out.println("模板2第一部分实现");
    }

    @Override
    public void part2() {
        System.out.println("模板2第二部分实现");
    }

    @Override
    public void part3() {
        System.out.println("模板2第三部分实现");
    }
}

函数入口

java 复制代码
package templatemethod;

public class MainTest {
    public static void main(String[] args) {
        // 使用第一种模板实现
        BaseTemplate template = new TemplateMethod1();
        template.useTemplateMethod();

        System.out.println();

        // 使用第二种模板实现
        template = new TemplateMethod2();
        template.useTemplateMethod();
    }
}

终端输出

复制代码
模板1第一部分实现
模板1第二部分实现
模板1第三部分实现

模板2第一部分实现
模板2第二部分实现
模板2第三部分实现
相关推荐
罗超驿1 天前
SpringMVC 请求参数接收详解|单个参数、多参数、对象参数、@RequestParam参数重命名
java·后端·postman·javaee
古法安卓1 天前
Android-epoll原理详解
android·java·android studio
fireworks991 天前
接口鉴权(401与403)
java·后端
wear工程师1 天前
线程池里的异常去哪了?execute 和 submit 不是一回事
java
孔明click331 天前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·sa-token·springboot·权限·权限认证
吴声子夜歌1 天前
Java面试——设计模式(一)
java·设计模式·面试
半亩码田1 天前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
老郑聊AI业财智造1 天前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
省长1 天前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·后端·开源
MetaLite1 天前
SpringBoot异常处理-到底该转换还是继续抛-入口层与调用层不能一刀切
java·spring boot·后端