当前位置: 首页 > news >正文

Java设计模式之模板方法模式

概念

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,允许子类在不改变算法结构的情况下重定义某些步骤。父类通过模板方法控制流程,子类通过实现抽象方法填充细节。

作用

1.代码复用:公共逻辑抽取到父类,避免重复代码。

2.扩展性:子类只需关注差异部分,符合开闭原则。

3.流程控制:父类固定核心流程,防止子类破坏执行顺序。

场景

1.多个类具有相似流程但部分步骤不同(如数据解析、文件处理)。

2.需要固定核心算法流程,允许子类扩展特定步骤。

3.框架设计(如Spring的JdbcTemplate)。

举例(饮料制作)

// 饮料类
abstract class Beverage {
    // 准备食谱:模板方法 (final防止子类覆盖)
    public final void prepareRecipe() {
        // 烧开水
        boilWater();
        // 泡
        brew();
        // 倒入杯子
        pourInCup();
        // 是否加入调味剂
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 固定步骤:烧开水
    private void boilWater() {
        System.out.println("烧开水");
    }
    // 固定步骤:倒入杯子
    private void pourInCup() {
        System.out.println("倒入杯子");
    }

    // 抽象方法(必须实现)
    abstract void brew();
    abstract void addCondiments();

    // 钩子方法(可选覆盖)
    boolean customerWantsCondiments() {
        return true;
    }
}
class Coffee extends Beverage {
    @Override
    void brew() {
        System.out.println("冲泡咖啡粉");
    }

    @Override
    void addCondiments() {
        System.out.println("加糖和牛奶");
    }

    @Override
    boolean customerWantsCondiments() {
        return false; // 示例:咖啡不要调料
    }
}
class Tea extends Beverage {
    @Override
    void brew() {
        System.out.println("浸泡茶叶");
    }

    @Override
    void addCondiments() {
        System.out.println("加柠檬");
    }
}

优点和缺点

优点

缺点

代码复用率高

增加类数量(每个差异需一个子类)

扩展性强(新增子类即可)

父类修改可能影响所有子类

反向控制结构(父类调用子类)

过度继承可能导致系统复杂

不使用模板方法的实现

class CoffeeWithoutPattern {
    public void makeCoffee() {
        System.out.println("烧开水");
        System.out.println("冲泡咖啡粉");
        System.out.println("倒入杯子");
        System.out.println("加糖和牛奶"); // 重复代码
    }
}
class TeaWithoutPattern {
    public void makeTea() {
        System.out.println("烧开水");       // 重复代码
        System.out.println("浸泡茶叶");
        System.out.println("倒入杯子");    // 重复代码
        System.out.println("加柠檬");
    }
}

存在的问题

1.重复代码:烧开水、倒杯子的代码重复。

2.维护困难:修改流程需改动所有类。

3.无法强制统一流程:子类可能遗漏步骤或改变顺序。

方案

代码量

扩展性

维护成本

流程控制

模板方法

严格统一

传统实现

自由松散

设计启示:当遇到多个相似流程的类时,优先使用模板方法模式消除重复代码,尤其适合需要严格流程控制的场景。

相关文章:

  • 蓝桥杯国赛子串2023动态规划,暴力
  • 从WebRTC到嵌入式:EasyRTC如何借助大模型提升音视频通信体验
  • Jmeter使用之http请求默认值
  • Sqoop框架调研
  • Unity Shader 学习16:全局光照 概念理解
  • 机械革命蛟龙16pro玩游戏闪屏
  • flutter本地运行web端图片跨域解决
  • jmeter 循环控制器遍历列表中的数据
  • 网络安全 | 什么是威胁情报?
  • 【数学建模】灰色关联分析模型详解与应用
  • OpenCV图像拼接(5)用于计算一组图像的特征点和描述符的函数computeImageFeatures()
  • Flutter小白零基础入门到高级项目实战全集
  • 移动笔试丨中国移动笔试2025届笔试考什么?运营商春招攻略、考点技巧|附真题秘籍、题型介绍、面试攻略、求职建议
  • pytorch小记(十一):pytorch中 `torch.nn.Dropout` 详解
  • Ranger 鉴权
  • Leetcode 刷题笔记1 图论part01
  • 【python小游戏】俄罗斯方块
  • 主流NoSQL数据库类型及选型分析
  • Redis客户端Jedis、Lettuce 和 Redisson优缺点总结
  • 【Linux———生产消费模型】
  • 光明网评论员:手机“二次放号”,需要重新确认“你是你”
  • 俄罗斯称已收复库尔斯克州
  • 最高法知识产权法庭:6年来新收涉外案件年均增长23.2%
  • 政治局会议:持续稳定和活跃资本市场
  • 双拥主题歌曲MV:爱我人民,爱我军
  • 全国首个古文学习AI大模型在沪发布,可批阅古文翻译