【设计模式系列】策略模式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();
    }
}
相关推荐
困鲲鲲4 小时前
设计模式:中介者模式 Mediator
设计模式·中介者模式
困鲲鲲8 小时前
设计模式:状态模式 State
设计模式·状态模式
蝸牛ちゃん10 小时前
设计模式(十一)结构型:外观模式详解
设计模式·系统架构·软考高级·外观模式
weixin_4708802611 小时前
设计模式实战:自定义SpringIOC(亲手实践)
设计模式·面试·个人提升·springioc·设计模式实战·spring框架原理
阳光明媚sunny12 小时前
创建型设计模式-工厂方法模式和抽象工厂方法模式
设计模式·工厂方法模式
困鲲鲲13 小时前
设计模式:代理模式 Proxy
设计模式·代理模式
就是帅我不改16 小时前
深入实战工厂模式与观察者模式:工厂模式与观察者模式在电商系统中的应用
后端·设计模式
云中飞鸿1 天前
结合项目阐述 设计模式:单例、工厂、观察者、代理
设计模式
蝸牛ちゃん1 天前
设计模式(二十四)行为型:访问者模式详解
设计模式·系统架构·软考高级·访问者模式