23种设计模式——模板方法模式(Template Method Pattern)详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏: 设计模式
✨特色专栏: 知识分享
🥭本文内容: 23种设计模式------模板方法模式(Template Method Pattern)详解
📚 ** ps ** : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一、背景

二、介绍

三、核心概念

四、使用场景

五、Java代码示例

六、优点

七、注意事项


一、背景

模板方法模式在项目java项目中偶尔会有使用,特别是在封装基类并且基类的某个方法执行顺序(比如生命周期)很重要的时候。比如android的基类activity代码。


二、介绍

模板方法模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。这种模式使得子类可以不改变算法结构的情况下重新定义算法的某些特定步骤。


三、核心概念

  1. ​抽象类(Abstract Class)​​:定义算法骨架和抽象方法

  2. ​具体类(Concrete Class)​​:实现抽象类中的抽象方法


四、使用场景

  • 当多个类有相同的方法,但实现方式不同时

  • 需要控制子类扩展时(通过钩子方法)

  • 重构时发现多个类有相似的算法结构时


五、Java代码示例

复制代码
// 抽象类定义模板方法
abstract class AbstractClass {
    // 模板方法,定义算法骨架
    public final void templateMethod() {
        step1();
        step2();
        step3();
        if (hookMethod()) {
            step4();
        }
    }
    
    // 具体步骤
    private void step1() {
        System.out.println("执行步骤1");
    }
    
    // 抽象方法,由子类实现
    protected abstract void step2();
    
    // 默认实现,子类可选择覆盖
    protected void step3() {
        System.out.println("执行默认步骤3");
    }
    
    protected void step4() {
        System.out.println("执行可选步骤4");
    }
    
    // 钩子方法,子类可覆盖以改变算法流程
    protected boolean hookMethod() {
        return true;
    }
}

// 具体实现类A
class ConcreteClassA extends AbstractClass {
    @Override
    protected void step2() {
        System.out.println("ConcreteClassA 实现步骤2");
    }
    
    @Override
    protected boolean hookMethod() {
        return false; // 不执行步骤4
    }
}

// 具体实现类B
class ConcreteClassB extends AbstractClass {
    @Override
    protected void step2() {
        System.out.println("ConcreteClassB 实现步骤2");
    }
    
    @Override
    protected void step3() {
        System.out.println("ConcreteClassB 覆盖步骤3");
    }
}

// 使用示例
public class TemplateMethodDemo {
    public static void main(String[] args) {
        AbstractClass classA = new ConcreteClassA();
        classA.templateMethod();
        
        System.out.println("----------------");
        
        AbstractClass classB = new ConcreteClassB();
        classB.templateMethod();
    }
}

六、优点

  1. 提高代码复用性,将公共代码放在抽象类中

  2. 便于扩展,子类只需实现自己的特定步骤

  3. 符合开闭原则,增加新子类无需修改现有代码


七、注意事项

  1. 模板方法应声明为final,防止子类覆盖算法结构

  2. 抽象方法数量不宜过多,否则会增加子类实现难度

  3. 合理使用钩子方法,增加灵活性

模板方法模式在Java中广泛应用,例如:

  • Java IO中的InputStream/OutputStream

  • Servlet中的HttpServlet

  • Spring框架中的JdbcTemplate等


最后,

其它设计模式会陆续更新,希望文章对你有所帮助!