软件设计模式:模板方法模式

1. 简介

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

2. 使用条件

模板方法模式适用于以下情况:

算法的结构相同,但具体步骤可能不同;

需要在不同情况下共享相同的算法,但某些步骤的实现可能不同;

不希望子类覆盖整个算法,只能覆盖部分步骤。

3. 示例场景

假设我们要实现一个炒菜的过程,其中包括选菜、洗菜、炒菜、上菜等步骤。不同的菜品在炒菜的步骤和时间上可能有所不同,但整个炒菜的流程是相同的。

4. Java 代码示例

java 复制代码
abstract class CookDishTemplate {
    public final void cookDish() {
        selectIngredients();
        washIngredients();
        fryIngredients();
        serveDish();
    }

    protected abstract void selectIngredients();

    protected abstract void washIngredients();

    protected abstract void fryIngredients();

    protected abstract void serveDish();
}

class CookVegetableDish extends CookDishTemplate {
    protected void selectIngredients() {
        System.out.println("选择新鲜的蔬菜");
    }

    protected void washIngredients() {
        System.out.println("清洗蔬菜");
    }

    protected void fryIngredients() {
        System.out.println("炒蔬菜");
    }

    protected void serveDish() {
        System.out.println("上菜:蔬菜炒鸡蛋");
    }
}

class CookMeatDish extends CookDishTemplate {
    protected void selectIngredients() {
        System.out.println("选择新鲜的肉类");
    }

    protected void washIngredients() {
        System.out.println("清洗肉类");
    }

    protected void fryIngredients() {
        System.out.println("炒肉类");
    }

    protected void serveDish() {
        System.out.println("上菜:红烧肉");
    }
}

public class TemplateMethodPatternExample {
    public static void main(String[] args) {
        CookDishTemplate vegetableDish = new CookVegetableDish();
        CookDishTemplate meatDish = new CookMeatDish();

        System.out.println("炒菜流程:");
        vegetableDish.cookDish();
        System.out.println();

        System.out.println("炒肉流程:");
        meatDish.cookDish();
    }
}

5. 结论

模板方法模式通过定义算法的骨架和具体步骤,实现了代码复用和扩展的便利性。在设计时,应该根据具体情况选择合适的设计模式,以提高代码的可维护性和可扩展性。

相关推荐
上官浩仁3 分钟前
springboot synchronized 本地锁入门与实战
java·spring boot·spring
Gogo8164 分钟前
java与node.js对比
java·node.js
SmartJavaAI10 分钟前
Java调用Whisper和Vosk语音识别(ASR)模型,实现高效实时语音识别(附源码)
java·人工智能·whisper·语音识别
用户37215742613514 分钟前
Python 高效实现 Word 转 PDF:告别 Office 依赖
java
渣哥19 分钟前
Java ThreadPoolExecutor 动态调整核心线程数:方法与注意事项
java
Miraitowa_cheems30 分钟前
LeetCode算法日记 - Day 38: 二叉树的锯齿形层序遍历、二叉树最大宽度
java·linux·运维·算法·leetcode·链表·职场和发展
麦当_44 分钟前
TanStack Router File-Based Router Mask 完全指南
前端·javascript·设计模式
稻草猫.1 小时前
Java多线程(一)
java·后端·java-ee·idea
躲在云朵里`1 小时前
Spring Scheduler定时任务实战:从零掌握任务调度
java·数据库·mybatis
Java中文社群1 小时前
炸裂:SpringAI新版发布,终于支持断线重连了!
java·后端·ai编程