Java中的模板方法模式详解
字数 502 2025-11-09 00:20:50
Java中的模板方法模式详解
一、模式描述
模板方法模式是一种行为型设计模式,它在父类中定义算法的骨架(即步骤顺序),而将某些步骤的具体实现延迟到子类中。该模式允许子类在不改变算法结构的情况下重新定义某些步骤,从而实现代码复用和扩展性。
二、模式结构
- 抽象类(Abstract Class):
- 定义算法的模板方法(
final修饰,防止子类重写算法结构)。 - 声明抽象方法(需子类实现)或钩子方法(默认空实现,子类可选重写)。
- 定义算法的模板方法(
- 具体类(Concrete Class):
- 实现父类中的抽象方法,填充算法细节。
三、实现步骤
-
定义抽象类:
public abstract class AbstractTemplate { // 模板方法:定义算法步骤 public final void execute() { step1(); step2(); if (needStep3()) { // 钩子方法控制流程 step3(); } } // 抽象方法:必须由子类实现 protected abstract void step1(); protected abstract void step2(); // 钩子方法:子类可选重写 protected boolean needStep3() { return false; } // 默认实现 protected void step3() { System.out.println("默认步骤3"); } } -
创建具体类:
public class ConcreteTemplateA extends AbstractTemplate { @Override protected void step1() { System.out.println("A实现步骤1"); } @Override protected void step2() { System.out.println("A实现步骤2"); } // 重写钩子方法,启用步骤3 @Override protected boolean needStep3() { return true; } } public class ConcreteTemplateB extends AbstractTemplate { @Override protected void step1() { System.out.println("B实现步骤1"); } @Override protected void step2() { System.out.println("B实现步骤2"); } // 不重写needStep3(),默认跳过步骤3 } -
使用模板方法:
public class Demo { public static void main(String[] args) { AbstractTemplate A = new ConcreteTemplateA(); A.execute(); // 输出:A实现步骤1 → A实现步骤2 → 默认步骤3 AbstractTemplate B = new ConcreteTemplateB(); B.execute(); // 输出:B实现步骤1 → B实现步骤2 } }
四、模式优势
- 复用性:将公共逻辑封装在父类,避免代码重复。
- 扩展性:子类可通过重写方法灵活扩展特定步骤。
- 符合开闭原则:新增子类无需修改父类逻辑。
五、应用场景
- 多个类有相似流程,但部分步骤实现不同(如JDBC模板、Spring的
JdbcTemplate)。 - 需要控制子类扩展行为时(如通过钩子方法)。
六、注意事项
- 模板方法应声明为
final,防止子类破坏算法结构。 - 抽象方法不宜过多,避免增加子类实现负担。