设计模式 - 模板方法模式

该模式将定义一个操作中的算法骨架,并将算法的一些步骤延迟到子类中实现,使得子类可以在不改变算法结构的情况下重定义算法的某些特定步骤。

例如,炒菜的步骤是固定的,具体可分为倒油、热油、倒蔬菜、倒调料品、翻炒等。通过模板方法模式模拟:

java 复制代码
public abstract class AbstractClass {  
    public final void cookProcess() {  
        // 固定的炒菜步骤
        this.pourOil();  
        this.heatOil();  
        this.pourVegetable();   
        this.pourSauce();  
        this.fry();  
    }  
    
    // 倒油、热油、翻炒 是一样的,在抽象类中直接实现
    public void pourOil() { System.out.println("倒油"); }  
    public void heatOil() { System.out.println("热油"); }  
    public void fry() { System.out.println("翻炒"); }  
     
    // 倒蔬菜、倒调料品 取决于蔬菜种类,延迟到子类中实现
    public abstract void pourVegetable();   
    public abstract void pourSauce();  
}

public class ConcreteClassOfTomato extends AbstractClass { 
    @Override  
    public void pourVegetable() {  
        System.out.println("下锅的蔬菜是西红柿");  
    }  
    
    @Override  
    public void pourSauce() {  
        System.out.println("下锅的酱料是盐");  
    }  
}

优点

  1. 提高代码复用

  2. 实现了反向控制,由父类决定整体流程,子类仅提供局部细节的实现,遵守 OCP 开闭原则

缺点

  1. 每当新增一个不同的实现时,都需要定义一个新的子类,导致类个数增加,系统复杂度增加

  2. 反向控制增加了代码阅读的难度

相关推荐
是三好9 分钟前
并发容器(Collections)
java·多线程·juc
jian1105816 分钟前
java项目实战、pom.xml配置解释、pojo 普通java对象
java·开发语言·python
述雾学java33 分钟前
Spring Boot是什么?MybatisPlus常用注解,LambdaQueryWrapper常用方法
java·spring boot·后端
jinhuazhe201333 分钟前
maven 3.0多线程编译提高编译速度
java·maven
xosg1 小时前
HTMLUnknownElement的使用
java·前端·javascript
forestsea2 小时前
Java虚拟机面试题:内存管理(上)
java·开发语言
yueyekkx2 小时前
Ubuntu24.04 LTS安装java8、mysql8.0
java·mysql·ubuntu
暴躁哥2 小时前
深入理解设计模式:工厂模式、单例模式
单例模式·设计模式·建造者模式·工厂模式
若水uy2 小时前
静态分配动态绑定
java
xosg2 小时前
嵌入式<style>设计模式
设计模式