设计模式之模板模式

模板模式(Template Method Pattern)是行为设计模式之一,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,从而达到复用算法框架和特定步骤定制化的目的。

详细介绍

模板模式通过把不变的行为搬移到超类,去除子类中的重复代码,提供一个固定的执行框架。这个框架由一个抽象类实现,其中定义了一个或多个抽象方法,这些抽象方法由子类具体实现,同时定义了一个模板方法,用于调用这些抽象方法,从而实现特定的业务逻辑流程。

使用场景

  1. 多个子类有共有的操作序列,但其中部分步骤的具体实现不同。
  2. 需要控制子类扩展的方式,确保子类在扩展时遵循一定的逻辑结构。
  3. 想要利用多态来避免代码重复,同时保持代码的结构清晰。

注意事项

  • 避免过度设计:确认模式适用性,避免为简单的逻辑引入不必要的复杂度。
  • 抽象类的设计:确保抽象类中的模板方法定义了清晰的操作流程,且抽象方法的粒度适中,既不过于细化也不过于笼统。
  • 子类实现的约束:明确哪些方法是必须实现的(通常是抽象方法),并考虑是否需要提供默认实现以简化子类的编写。

优缺点

优点

  • 代码复用:共享相同的算法结构,减少代码重复。
  • 扩展性好:新增子类时,只需实现特定的方法,无需修改模板方法,符合开闭原则。
  • 提高代码可读性和维护性:模板方法定义了高层逻辑,使得业务流程更清晰。

缺点

  • 过度依赖抽象:如果抽象类发生变化,可能需要修改所有子类。
  • 设计复杂度增加:增加了类之间的耦合,尤其是当抽象类和子类之间的关系变得复杂时。

Java代码示例

java 复制代码
abstract class AbstractClass {
    public final void templateMethod() {
        stepOne();
        stepTwo();
        stepThree();
    }

    protected abstract void stepTwo();

    private void stepOne() {
        System.out.println("执行模板方法的第一个步骤");
    }

    private void stepThree() {
        System.out.println("执行模板方法的第三个步骤");
    }
}

class ConcreteClassA extends AbstractClass {
    @Override
    protected void stepTwo() {
        System.out.println("ConcreteClassA 实现的第二个步骤");
    }
}

class ConcreteClassB extends AbstractClass {
    @Override
    protected void stepTwo() {
        System.out.println("ConcreteClassB 实现的第二个步骤");
    }
}

public class TemplatePatternDemo {
    public static void main(String[] args) {
        AbstractClass classA = new ConcreteClassA();
        classA.templateMethod();

        AbstractClass classB = new ConcreteClassB();
        classB.templateMethod();
    }
}

可能遇到的问题及解决方案

  • 问题 :随着子类增多,抽象类可能变得庞大且难以维护。
    • 解决方案:考虑使用接口和组合而非继承,或者进一步抽象出更多的抽象类来分解职责。

与其他模式的对比

  • 与策略模式:两者都涉及委托给子类实现,但模板模式强调的是算法的整体结构固定,变化点在于具体步骤;而策略模式则完全将算法的实现交由子类,更侧重于算法的完全可替代性。
  • 与工厂方法模式:工厂方法关注对象创建过程的抽象和推迟,而模板方法关注算法结构的固定与步骤的延迟实现,两者解决的问题域不同。

模板模式通过提供一个固定的执行框架,有效减少了代码重复,提升了代码的组织性和可维护性,是处理一系列相似操作时的一个有力工具。

相关推荐
VX:Fegn0895几秒前
计算机毕业设计|基于springboot + vue心理健康管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
掘金考拉2 分钟前
从原理到实战:JWT认证深度剖析与架构思考(二)——数据透明 vs 无法撤销
后端
Sherry0075 分钟前
从零开始理解 JavaScript Promise:彻底搞懂异步编程
前端·javascript·promise
毛发浓密的女猴子5 分钟前
一次弹窗异常引发的思考:iOS present / push 底层机制全解析
前端
Toomey6 分钟前
一次 npm 更新强制2FA导致的发布失败的排查:403、2FA、Recovery Code、Granular Token 的混乱体验
前端
小满、6 分钟前
Redis:数据结构与基础操作(String、List、Hash、Set、Sorted Set)
java·数据结构·redis·分布式锁
用户4445543654267 分钟前
Android模块化管理
前端
alien爱吃蛋挞9 分钟前
【JavaEE】Spring Boot日志
java·数据库·spring boot
小胖霞11 分钟前
vite+ts+monorepo从0搭建vue3组件库(五):vite打包组件库
前端·vue.js·前端框架
神算大模型APi--天枢64614 分钟前
国产硬件架构算力平台:破解大模型本地化部署难题,标准化端口加速企业 AI 落地
大数据·前端·人工智能·架构·硬件架构