【设计模式系列】策略模式vs模板模式

策略模式是什么?如何定义并封装一系列算法

策略模式 (Strategy Pattern)

应用场景:当需要根据不同条件选择不同算法或行为时,将算法封装成独立的策略类,使它们可以互相替换。

在这里插入图片描述

模板模式 (Template Pattern)

应用场景:当需要根据不同条件选择不同算法或行为时,将算法封装成独立的策略类,使它们可以互相替换

模板模式与策略模式的深度对比与区分

确实,模板模式和策略模式在结构上有相似之处,但它们的设计意图和应用场景有本质区别。下面我将详细分析两者的异同,并通过典型场景的代码示例展示它们的区别。

核心区别对比表

特性 模板模式 (Template Method) 策略模式 (Strategy)
设计目的 定义算法骨架,允许子类重写特定步骤 定义算法家族,使它们可以互相替换
控制流程 父类控制流程,子类实现部分步骤 策略接口定义行为,上下文选择具体策略
代码复用 通过继承实现代码复用 通过组合实现行为复用
扩展方式 垂直扩展(子类化) 水平扩展(添加新策略)
运行时灵活性 编译时确定行为 运行时动态切换行为
适用场景 有固定流程但部分步骤可变 需要灵活切换不同算法
类关系 继承关系 abstract 组合关系 interface
变化部分 算法中的某些步骤 整个算法或策略

混合使用两种模式的场景

在实际开发中,可以结合两种模式的优点:

java 复制代码
// 策略接口
interface CompressionStrategy {
    byte[] compress(byte[] data);
}

// 具体策略
class ZipCompression implements CompressionStrategy {
    @Override
    public byte[] compress(byte[] data) {
        System.out.println("使用ZIP算法压缩");
        return data; // 简化实现
    }
}

class RarCompression implements CompressionStrategy {
    @Override
    public byte[] compress(byte[] data) {
        System.out.println("使用RAR算法压缩");
        return data; // 简化实现
    }
}

// 模板类
abstract class FileProcessor {
    private CompressionStrategy compressionStrategy;
    
    public FileProcessor(CompressionStrategy strategy) {
        this.compressionStrategy = strategy;
    }
    
    // 模板方法
    public final void processFile() {
        validateFile();
        byte[] data = readFile();
        byte[] processedData = processData(data);
        byte[] compressedData = compressionStrategy.compress(processedData);
        saveFile(compressedData);
        logResult();
    }
    
    protected abstract void validateFile();
    protected abstract byte[] readFile();
    protected abstract byte[] processData(byte[] data);
    protected abstract void saveFile(byte[] data);
    
    protected void logResult() {
        System.out.println("文件处理完成");
    }
}

// 具体实现
class ImageProcessor extends FileProcessor {
    public ImageProcessor(CompressionStrategy strategy) {
        super(strategy);
    }
    
    @Override
    protected void validateFile() {
        System.out.println("验证图片文件格式");
    }
    
    @Override
    protected byte[] readFile() {
        System.out.println("读取图片文件");
        return new byte[0]; // 简化实现
    }
    
    @Override
    protected byte[] processData(byte[] data) {
        System.out.println("处理图片数据");
        return data;
    }
    
    @Override
    protected void saveFile(byte[] data) {
        System.out.println("保存处理后的图片");
    }
}

// 使用
public class MixedDemo {
    public static void main(String[] args) {
        // 使用模板模式定义处理流程,策略模式切换压缩算法
        FileProcessor processor = new ImageProcessor(new ZipCompression());
        processor.processFile();
        
        System.out.println("------");
        
        processor = new ImageProcessor(new RarCompression());
        processor.processFile();
    }
}
相关推荐
szm02251 天前
设计模式-
设计模式
砍光二叉树1 天前
【设计模式】创建型-抽象工厂模式
设计模式·抽象工厂模式
砍光二叉树1 天前
【设计模式】创建型-工厂方法模式
设计模式·工厂方法模式
我爱学习_zwj1 天前
设计模式-2(单例模式与原型模式)
前端·javascript·设计模式
砍光二叉树1 天前
【设计模式】创建型-单例模式
单例模式·设计模式
我爱学习_zwj1 天前
设计模式-3(装饰器模式)
前端·设计模式·装饰器模式
文心快码BaiduComate2 天前
Comate内置模型已支持 MiniMax-M2.7!
设计模式·程序员·前端框架
console.log('npc')2 天前
Cursor,Trae,Claude Code如何协作生产出一套前后台app?
前端·人工智能·react.js·设计模式·ai·langchain·ai编程
czxyvX2 天前
C++ - 基于多设计模式下的同步&异步日志系统
c++·设计模式
Rabbit_QL2 天前
【Warp+Claude】任务完成自动通知(macOS + Warp 版)
macos·策略模式