【模版方法设计模式】

文章目录

模板方法设计模式

模版方法设计模式(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();
    }
}
相关推荐
个 人 练 习 生3 分钟前
C++中的内存管理
开发语言·c++·经验分享·学习
jingli930 分钟前
本地向量库索引把 C 盘塞爆 48.6G:一次 LanceDB 膨胀排查与根治实录
c语言·开发语言
言乐631 分钟前
Python排名统计折线图
开发语言·python·django·virtualenv·pygame
hai_android43 分钟前
LruCache 图片浏览器内存缓存
android·java·kotlin
玩美移动1 小时前
AI Skin Analysis API 技术解析:文件上传、异步任务与结果读取
java·人工智能·python
我是小白呀1 小时前
19-Temporal项目实战:将客户开通流程迁移到持久执行架构
java·开发语言·人工智能·架构·workflow
励志不掉头发的内向程序员1 小时前
【从零写一个CAD 02】画完第一条线之后:实体容器、Esc 取消,和按了没反应的键盘
开发语言·c++·qt·学习·系统架构
Zane19941 小时前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
步行cgn1 小时前
Spring 负责注入的注解详解
java·sql·spring
摇滚侠1 小时前
《On Java 中文版 基础卷》阅读笔记 安装 Java 和本书示例 02
java·开发语言·笔记