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

23 种设计模式中的模板模式

在父类中定义了算法的骨架,将某些步骤延迟到字类中,并允许子类在不改变算法结构的前提下重定义算法的某些特定步骤。

模板方法,主要的设计思想是,一个抽象的公开类定义了方法的框架。对于其中的一系列步骤,暂时确定不下来的步骤,就留给子类去实现好了。这样,不同的子类就可以定义不同的步骤。

这里我们根据案例来具体学习访问者模式。以下是一个代码示例及知识点详解。

假设我们要制作两种饮料:茶和咖啡。它们的制作过程有一些共同的步骤,但有一些步骤是不同的。我们可以使用模板方法来实现这个场景。

我们将创建一个定义操作的Beverage类,其中,模板方法定义为 final,这样它就不会被重写。TeaCoffee扩展了Beverage,它们重写了抽象类的方法。

定义抽象类Beverage

abstract class Beverage {

    // 模板方法,定义了制作饮料的算法框架
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 具体步骤,子类必须实现
    abstract void brew();

    abstract void addCondiments();

    // 具体步骤,子类可以选择覆盖
    boolean customerWantsCondiments() {
        return true;
    }

    // 具体步骤,通用方法
    void boilWater() {
        System.out.println("Boiling water");
    }

    void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

定义实体类Tea

class Tea extends Beverage {

    @Override
    void brew() {
        System.out.println("Steeping the tea");
    }

    @Override
    void addCondiments() {
        System.out.println("Adding lemon");
    }

    @Override
    boolean customerWantsCondiments() {
        // 假设用户不喜欢加柠檬
        return false;
    }
}

定义实体类Coffee

class Coffee extends Beverage {

    @Override
    void brew() {
        System.out.println("Dripping coffee through filter");
    }

    @Override
    void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

使用模板方法。

public class TemplateMethodDemo {
    public static void main(String[] args) {
        Beverage tea = new Tea();
        Beverage coffee = new Coffee();

        System.out.println("Making tea...");
        tea.prepareBeverage();

        System.out.println("\nMaking coffee...");
        coffee.prepareBeverage();
    }
}
  • Beverage 类中的 prepareBeverage() 方法是模板方法,它定义了制作饮料的算法框架。
  • brew()addCondiments() 是抽象方法,子类必须实现这些方法以提供具体的步骤。
  • customerWantsCondiments() 是一个钩子方法,子类可以选择覆盖它来改变算法的行为。
  • boilWater()pourInCup() 是具体方法,它们在父类中实现,子类可以直接使用。

通过这种方式,模板方法模式允许我们在不改变算法结构的情况下,灵活地改变算法的某些步骤。

总结

模板方法是一种高层定义骨架,底层实现细节的设计模式,适用于流程固定,但某些步骤不确定或可替换的情况。

相关文章:

  • 【CXX-Qt】4.1 extern “RustQt“
  • JAVA开发:实例成员与静态成员
  • MySQL 优化详解:从基础到高级全面指南
  • PSA方法计算器(PSA Method Calculator): 鼠标完美灵敏度测试网站
  • Spring Boot属性设置方法及优先级完整说明+表格对比
  • PyTorch图像预处理--Compose
  • 分别通过 JNI和纯java 实现对 Windows 注册表的增删改查操作的完整示例,包含详细注释和步骤说明
  • 【设计模式】工厂模式详解-----简单工厂模式、工厂方法模式、抽象工厂模式
  • 当一个按键“摆烂”时,需要更换整个键盘吗?
  • Selenium之简介
  • Json冲突崩溃问题
  • Logit-Laplace 分布:解决图像生成中像素值范围匹配问题的创新分布
  • cellnet框架概述
  • SQL 函数
  • stm32 f1 外接大功率负载方案 6DI/8DO/4AI/1AO
  • Node.js 模块系统
  • 【Linux】MAC帧
  • ClickHouse常见问题总结
  • DeepSeek概述
  • Oracle常用分析诊断工具(9)——ADDM
  • 向左繁华都市,向右和美乡村,嘉兴如何打造城乡融合发展样本
  • 五一“大车流”来了,今日午后G40沪陕高速开始迎来出沪高峰
  • 辽宁辽阳火灾3名伤者无生命危险
  • 广东省副省长刘红兵任湖南省委常委、宣传部部长
  • 昆明破获一起算命破灾诈骗案,民警:大师算不到自己的未来
  • 日月谭天丨赖清德强推“脱中入北”是把台湾带向死路