(十 三)趣学设计模式 之 模版方法模式!

目录

    • [一、 啥是模板方法模式?](#一、 啥是模板方法模式?)
    • [二、 为什么要用模板方法模式?](#二、 为什么要用模板方法模式?)
    • [三、 模板方法模式的实现方式](#三、 模板方法模式的实现方式)
    • [四、 模板方法模式的优缺点](#四、 模板方法模式的优缺点)
    • [五、 模板方法模式的应用场景](#五、 模板方法模式的应用场景)
    • [六、 总结](#六、 总结)

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解享元模式请看: (十 二)趣学设计模式 之 享元模式!
✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的模版方法模式

一、 啥是模板方法模式?

想象一下,你想要制作一杯咖啡 ☕。 制作咖啡的步骤大致相同:烧水 💧、冲泡咖啡 ☕、倒入杯中 🥛、加入调料 🍬。 但是,不同的咖啡,加入的调料可能不同 (比如:拿铁加牛奶,美式加糖)。

模板方法模式,就是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中! 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 🦴。

简单来说,就是定义一个模板,规定了算法的执行流程,具体的实现细节由子类来完成! 📝

  • 你有一系列相似的算法,它们的执行流程基本相同: 就像制作不同口味的咖啡 ☕!
  • 你想让子类可以灵活地定制算法的某些步骤: 就像不同的咖啡可以加入不同的调料 🍬!
  • 你想避免代码重复: 就像你不想在每个咖啡类中都重复编写烧水、冲泡咖啡、倒入杯中的代码 💧☕🥛!

二、 为什么要用模板方法模式?

用模板方法模式,好处多多 👍:

  • 代码复用: 将公共代码提取到父类中,减少代码重复 ♻️!
  • 控制算法流程: 父类控制算法的执行流程,子类只能定制特定的步骤 📝!
  • 提高扩展性: 可以方便地添加新的算法,只需要创建新的子类即可 ➕!
  • 符合开闭原则: 可以在不修改父类代码的情况下,扩展算法的功能 ✅!

三、 模板方法模式的实现方式

模板方法模式主要包含以下几个角色:

  • AbstractClass(抽象类): 定义抽象的模板方法,以及一些具体的辅助方法。 ☕ (比如:咖啡基类)
  • ConcreteClass(具体类): 实现抽象类中的抽象方法,完成算法的特定步骤。 ☕ (比如:拿铁咖啡、美式咖啡)

代码示例:

java 复制代码
// 抽象类:咖啡
public abstract class Coffee {
    // 模板方法:制作咖啡
    public final void makeCoffee() {
        boilWater(); // 烧水
        brewCoffee(); // 冲泡咖啡
        pourInCup(); // 倒入杯中
        addCondiments(); // 加入调料
    }

    // 具体方法:烧水
    private void boilWater() {
        System.out.println("烧水");
    }

    // 抽象方法:冲泡咖啡
    protected abstract void brewCoffee();

    // 具体方法:倒入杯中
    private void pourInCup() {
        System.out.println("倒入杯中");
    }

    // 抽象方法:加入调料
    protected abstract void addCondiments();
}

// 具体类:拿铁咖啡
public class LatteCoffee extends Coffee {
    @Override
    protected void brewCoffee() {
        System.out.println("冲泡拿铁咖啡");
    }

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

// 具体类:美式咖啡
public class AmericanCoffee extends Coffee {
    @Override
    protected void brewCoffee() {
        System.out.println("冲泡美式咖啡");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入糖");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Coffee latte = new LatteCoffee(); // 创建拿铁咖啡
        latte.makeCoffee(); // 制作拿铁咖啡

        System.out.println("---");

        Coffee american = new AmericanCoffee(); // 创建美式咖啡
        american.makeCoffee(); // 制作美式咖啡
    }
}

分析:

  • Coffee 是抽象类,定义了制作咖啡的模板方法 makeCoffee(),以及一些具体的辅助方法 boilWater()pourInCup(),还有一些抽象方法 brewCoffee()addCondiments()
  • LatteCoffeeAmericanCoffee 是具体类,实现了抽象类中的抽象方法,完成了冲泡咖啡和加入调料的特定步骤。

输出结果:

复制代码
烧水
冲泡拿铁咖啡
倒入杯中
加入牛奶
---
烧水
冲泡美式咖啡
倒入杯中
加入糖

四、 模板方法模式的优缺点

优点:

  • 代码复用 ♻️!
  • 控制算法流程 📝!
  • 提高扩展性 ➕!
  • 符合开闭原则 ✅!

缺点:

  • 增加了系统的复杂度 😫!
  • 抽象类定义了算法的骨架,子类必须遵循这个骨架,灵活性受到限制 ⛓️!
  • 每个不同的实现都需要定义一个子类,导致类的数量增加 📈!

五、 模板方法模式的应用场景

  • 你有一系列相似的算法,它们的执行流程基本相同: 就像制作不同口味的咖啡 ☕!
  • 你想让子类可以灵活地定制算法的某些步骤: 就像不同的咖啡可以加入不同的调料 🍬!
  • 你想避免代码重复: 就像你不想在每个咖啡类中都重复编写烧水、冲泡咖啡、倒入杯中的代码 💧☕🥛!
  • 数据库访问: 数据库访问的流程通常是:建立连接、执行查询、处理结果、关闭连接。 可以使用模板方法模式来定义这个流程,具体的查询语句和结果处理由子类来完成。
  • Servlet处理: Servlet处理请求的流程通常是:接收请求、处理请求、发送响应。 可以使用模板方法模式来定义这个流程,具体的请求处理由子类来完成。

六、 总结

  • 模板方法模式就像定义一个模板,规定了算法的执行流程,具体的实现细节由子类来完成! 📝
  • 主要包含抽象类和具体类两个角色! 🎭
  • 优点是代码复用、控制算法流程、提高扩展性、符合开闭原则! 👍
  • 缺点是增加复杂度、灵活性受到限制、类的数量增加! 👎
  • 适用于有一系列相似的算法,它们的执行流程基本相同,且需要让子类灵活地定制算法的某些步骤的场景! 🎯

希望这篇文章能让你彻底理解模板方法模式! 💯 祝你学习愉快! 😄

看完请看:(十 四)趣学设计模式 之 策略模式!

相关推荐
云徒川2 分钟前
【设计模式】过滤器模式
windows·python·设计模式
花月C7 分钟前
Spring IOC:容器管理与依赖注入秘籍
java·开发语言·rpc
ylfhpy13 分钟前
Java面试黄金宝典22
java·开发语言·算法·面试·职场和发展
风象南1 小时前
Spring Boot 实现文件秒传功能
java·spring boot·后端
橘猫云计算机设计1 小时前
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·小程序·django·毕业设计
黑猫Teng1 小时前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
星河浪人1 小时前
Spring Boot启动流程及源码实现深度解析
java·spring boot·后端
佩奇的技术笔记1 小时前
中级:Maven面试题精讲
java·面试·maven
Lizhihao_1 小时前
JAVA-堆 和 堆排序
java·开发语言
极客先躯1 小时前
高级java每日一道面试题-2025年3月21日-微服务篇[Nacos篇]-什么是Nacos?
java·开发语言·微服务