• 二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界



    在软件设计的奇妙宇宙中,有一种设计模式如一颗流星般划过,留下绚丽的光芒,它就是——模板方法模式(Template Method Pattern)。这个模式不仅令代码更加灵活,而且蕴含了一种设计哲学,本文将深入研究模板方法模式,揭示其神秘的面纱,带你踏入设计模式的神秘大门。


    1. 模板方法模式简介

    模板方法模式是一种行为型设计模式,其核心思想在于定义一个算法的框架,将一些步骤的实现延迟到子类。这样,子类可以在不改变算法结构的情况下重新定义某些步骤的具体实现。


    2. 模板方法模式的核心结构

    在模板方法模式中,有两个主要角色:

    • 抽象类(Abstract Class): 定义算法框架,其中包含了一个或多个抽象方法,这些方法由子类负责实现。同时,抽象类中可能包含一些具体方法,它们构成了算法的骨架。
    • 具体子类(Concrete Class): 实现抽象类中定义的抽象方法,完成算法的具体步骤。同时,具体子类也可以覆盖抽象类中的某些具体方法,以满足特定需求。

    3. 模板方法模式的适用场景

    模板方法模式常常应用于以下场景:

    • 算法的骨架不可改变: 当一个算法的基本结构已经确定,但其中的一些步骤的具体实现可能各不相同时,可以使用模板方法模式。
    • 代码复用: 当多个类有相似的算法框架,但某些步骤的具体实现不同时,可以将这些相似的部分抽取到一个抽象类中,实现代码的复用。
    • 扩展性: 模板方法模式允许子类根据需要扩展或重写算法的部分步骤,从而实现灵活的扩展。

    4. 深入代码:模板方法模式实例

    为了更好地理解模板方法模式,让我们通过一个简单的实例来深入研究。假设我们有一个制作饮料的模板,其中包括了煮水、冲泡、倒入杯中等步骤。我们将创建一个抽象类 BeverageTemplate 来定义这个制作饮料的模板。

    // 抽象类
    abstract class BeverageTemplate {
        // 制作饮料的模板方法
        final void makeBeverage() {
            boilWater();
            brew();
            pourInCup();
            if (customerWantsCondiments()) {
                addCondiments();
            }
        }
    
        // 具体步骤的抽象方法,由子类实现
        abstract void brew();
    
        abstract void addCondiments();
    
        // 具体方法,已经实现的步骤
        void boilWater() {
            System.out.println("煮沸水");
        }
    
        void pourInCup() {
            System.out.println("倒入杯中");
        }
    
        // 钩子方法,用于控制某些步骤的执行
        boolean customerWantsCondiments() {
            return true;
        }
    }
    
    // 具体子类
    class Coffee extends BeverageTemplate {
        @Override
        void brew() {
            System.out.println("冲泡咖啡");
        }
    
        @Override
        void addCondiments() {
            System.out.println("加入牛奶和糖");
        }
    }
    
    class Tea extends BeverageTemplate {
        @Override
        void brew() {
            System.out.println("冲泡茶叶");
        }
    
        @Override
        void addCondiments() {
            System.out.println("加入柠檬");
        }
    
        // 重写钩子方法,控制是否加入调味品
        @Override
        boolean customerWantsCondiments() {
            return false;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    通过这个例子,我们可以看到 BeverageTemplate 定义了整个制作饮料的模板,而具体的步骤则由子类实现。这种模板方法模式使得制作不同类型的饮料变得简单而灵活。


    然而,设计模式世界中还有许多其他精彩的故事等待我们探索。在下一篇博文中,我们将深入研究另一个引人入胜的设计模式,为你带来更多惊喜。敬请期待!


    好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


  • 相关阅读:
    MFC图形函数学习03——画直线段函数
    C# 入门
    Java面试BAT通关手册
    Ubuntu系统下MySQL开启远程连接
    2022杭电多校第一场(K/L/B/C)
    【最优化算法】基于【MATLAB】的拟牛顿法【Quasi Newton method】分析与推导
    详解FreeRTOS:FreeRTOS任务删除过程源码分析(进阶篇—2)
    数据结构之散列表
    为什么说Java 中的公平锁(Fair Lock)并不是完全公平的,而是近似公平的
    leetcode 63. 不同路径 II
  • 原文地址:https://blog.csdn.net/lizhong2008/article/details/134470192