【模版方法设计模式】

文章目录

模板方法设计模式

模版方法设计模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。

这种设计模式的主要目的是让某些方法的具体实现推迟到子类中去完成,提供一种代码复用的机制。

模板方法的设计原则

1.单一职责:一个类和方法只做一件事。

2.开闭原则:对修改关闭,对扩展开发。

3.里氏替换原则:子类可扩展新方法,但不可修改父类已有方法(父类已提供了具体实现的方法)。

4.依赖倒置:依赖于抽象,而非具体实现,即面向接口编程(如方法参数,类属性使用接口声明,这样可接收任何子类)。

5.接口隔离:使用多个隔离的接口定义抽象,降低耦合。

6.最少知道/迪米特原则:降低类之间的依赖,聚合,组合等。

模板方法设计模式组成部分

抽象类(Abstract Class):

包含了模版方法及其所需的基本操作方法。

模版方法定义了算法的骨架,通常是由一些基本操作方法组成的步骤。

基本操作方法可以是抽象的(需要子类实现)或具体的(提供默认实现)。

具体子类(Concrete Class):

实现了抽象类中的基本操作方法。

通过重写基本操作方法,子类可以定制算法的某些步骤。

代码实现

抽象类实现

java 复制代码
// 抽象类,定义了制作饮料的算法骨架
abstract class Beverage {
    // 模版方法,定义了制作饮料的步骤
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 基本操作方法
    protected abstract void brew();  // 子类实现
    protected abstract void addCondiments();  // 子类实现

    private void boilWater() {
        System.out.println("Boiling water");
    }

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

具体实现类

java 复制代码
// 具体子类,具体实现制作茶的步骤
class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steeping the tea");
    }

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

// 具体子类,具体实现制作咖啡的步骤
class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Dripping coffee through filter");
    }

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

执行

java 复制代码
// 客户端代码
public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        Beverage tea = new Tea();
        tea.prepareRecipe();

        Beverage coffee = new Coffee();
        coffee.prepareRecipe();
    }
}
相关推荐
JAVA面经实录9176 分钟前
线上故障标准处理流程【完整版|面试背诵+生产落地】
java·面试·职场和发展
殷色玫瑰17 分钟前
C++入门基础复习:从命名空间到引用与nullptr,一篇重新捡回C++基础
java·开发语言·c++
(Charon)30 分钟前
【C++面试】手写线程池:任务队列、工作线程与优雅退出
开发语言·c++
言乐635 分钟前
Python概括后端原理
开发语言·python·django·virtualenv·pygame
@大迁世界1 小时前
JEV RAG:更高效的 RAG 系统解决方案?
开发语言·rust
大侠归来2 小时前
C语言素数判断:从入门到进阶
java·c语言·算法
谢亮_vipxieliang2 小时前
Spring Boot 自动配置原理:从 @SpringBootApplication 到自定义 Starter
java·spring boot·后端
朝朝辞暮i2 小时前
C++ 第一阶段总结:从零基础到 ROS2 前置语法
开发语言·c++·算法
朝朝辞暮i2 小时前
C++ 第 25 课:getter / setter + this
java·javascript·c++
2601_962885722 小时前
如何用 Python 回测定投策略(定期定额 DCA)?(和一次性买入对比)
开发语言·人工智能·python