策略模式是什么?如何定義并封裝一系列算法
- 策略模式 (Strategy Pattern)
- 模板模式 (Template Pattern)
- 模板模式與策略模式的深度對比與區分
- 混合使用兩種模式的場景
策略模式 (Strategy Pattern)
應用場景:當需要根據不同條件選擇不同算法或行為時,將算法封裝成獨立的策略類,使它們可以互相替換。
在這里插入圖片描述
模板模式 (Template Pattern)
應用場景:當需要根據不同條件選擇不同算法或行為時,將算法封裝成獨立的策略類,使它們可以互相替換
模板模式與策略模式的深度對比與區分
確實,模板模式和策略模式在結構上有相似之處,但它們的設計意圖和應用場景有本質區別。下面我將詳細分析兩者的異同,并通過典型場景的代碼示例展示它們的區別。
核心區別對比表
特性 | 模板模式 (Template Method) | 策略模式 (Strategy) |
---|---|---|
設計目的 | 定義算法骨架,允許子類重寫特定步驟 | 定義算法家族,使它們可以互相替換 |
控制流程 | 父類控制流程,子類實現部分步驟 | 策略接口定義行為,上下文選擇具體策略 |
代碼復用 | 通過繼承實現代碼復用 | 通過組合實現行為復用 |
擴展方式 | 垂直擴展(子類化) | 水平擴展(添加新策略) |
運行時靈活性 | 編譯時確定行為 | 運行時動態切換行為 |
適用場景 | 有固定流程但部分步驟可變 | 需要靈活切換不同算法 |
類關系 | 繼承關系 abstract | 組合關系 interface |
變化部分 | 算法中的某些步驟 | 整個算法或策略 |
混合使用兩種模式的場景
在實際開發中,可以結合兩種模式的優點:
// 策略接口
interface CompressionStrategy {byte[] compress(byte[] data);
}// 具體策略
class ZipCompression implements CompressionStrategy {@Overridepublic byte[] compress(byte[] data) {System.out.println("使用ZIP算法壓縮");return data; // 簡化實現}
}class RarCompression implements CompressionStrategy {@Overridepublic 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);}@Overrideprotected void validateFile() {System.out.println("驗證圖片文件格式");}@Overrideprotected byte[] readFile() {System.out.println("讀取圖片文件");return new byte[0]; // 簡化實現}@Overrideprotected byte[] processData(byte[] data) {System.out.println("處理圖片數據");return data;}@Overrideprotected 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();}
}