模板方法模式

一、定义

1、定义

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

2、模板方法模式涉及到的角色

(1)抽象模板角色:定义一个或多个抽象操作,以便于让子类实现;还需要定义几个模板方法,实现对基本方法的调度;

(2)具体模板角色:实现抽象模板定义的一个或多个抽象方法,每个抽象模板角色可以有任意多个具体模板与之对应,每个具体模板角色可以给出这些抽象方法的不同实现,使得顶级逻辑的实现各不相同;

二、类图

三、代码实现

1、抽象模板角色

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

/**
 * @author wangtw
 * @date 2023/11/29 21:44
 * @description 模板方法模式-抽象模板角色
 */
public abstract class AbstractClass {

    // 基本方法
    protected abstract void operation();

    // 公共方法
    protected void shareMethod() {
        System.out.println("这是公共操作");
    };

    // 模板方法
    public void templateMethod() {
        this.shareMethod();
        this.operation();
    }
}

2、具体模板角色1

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

/**
 * @author wangtw
 * @date 2023/11/29 21:50
 * @description 模板方法模式-具体模板角色1
 */
public class ConcreteOneClass extends AbstractClass{

    @Override
    protected void operation() {
        System.out.println("具体操作1");
    }
}

3、具体模板角色2

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

/**
 * @author wangtw
 * @date 2023/11/29 21:52
 * @description 模板方法模式-具体模板角色2
 */
public class ConcreteTwoClass extends AbstractClass{

    @Override
    protected void operation() {
        System.out.println("具体操作2");
    }
}

4、测试类

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

import org.junit.jupiter.api.Test;

/**
 * @author wangtw
 * @date 2023/11/29 21:53
 * @description 模板方法模式测试类
 */
public class TemplateMethodTest {

    @Test
    public void test() {
        AbstractClass acOne = new ConcreteOneClass();
        acOne.templateMethod();

        AbstractClass acTwo = new ConcreteTwoClass();
        acTwo.templateMethod();
    }
}

四、总结

1、模板方法模式的优点

(1)封装不变的部分,扩展可变部分。不变的部分封装到父类中实现,而可变的部门则可以通过继承进行扩展;

(2)提取公共代码,便于维护;

(3)行为由父类控制,子类实现,子类可以通过扩展增加相应的功能,符合开闭原则;

相关推荐
plainGeekDev8 小时前
单例模式 → object 声明
android·java·kotlin
用户298698530149 小时前
Java 实现 Word 文档文本与图片提取的方法
java·后端
SimonKing10 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
咖啡八杯21 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户128526116021 天前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk1 天前
组件 = 模板 + 业务逻辑
java·前端·vue.js
星沉远浦1 天前
用Gemini高效解决Java代码报错难以定位的问题
java
用户298698530141 天前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快1 天前
从单个服务到集群:一次完整的性能排查复盘
java·前端