1/24 設計模式之策略設計模式 Strategy Pattern

蘇小林發表於2020-02-26

類別:行為型設計模式

目的:把同類的程式碼進行單獨封裝、使得需要使用這部分程式碼的使用者可以按需使用

典型場景

對使用者上傳的圖片應用不同的壓縮演算法和濾鏡

壓縮演算法:

  1. jpeg格式
  2. png格式

濾鏡:

  1. blackAndWhite濾鏡
  2. backgroundBlur濾鏡

硬編碼

public class HardCode {
    public static void main(String[] args) {
        var fileName = "test.jpg";
        var compressor = "jpeg";
        var filter = "blackAndWhite";

        handleUpload(fileName, compressor, filter);
    }

    public static void handleUpload(String fileName, String compressor, String filter)
    {
        if (compressor.equals("jpeg")) {
            System.out.println("應用jpeg壓縮演算法...");
        } else if (compressor.equals("png")) {
            System.out.println("應用png壓縮演算法...");
        }

        if (filter.equals("blackAndWhite")) {
            System.out.println("應用blackAndWhite濾鏡");
        } else if (filter.equals("backgroundBlur")) {
            System.out.println("應用blackAndBlur濾鏡");
        }
    }
}
複製程式碼

模式實現

程式碼

按照程式碼類別定義介面

上面的程式碼分成兩類,一類是壓縮演算法,另一類是濾鏡演算法

壓縮演算法介面

public interface Compressor {
  void apply(String fileName);
}
複製程式碼

2個壓縮演算法的具體實現

public class JpegCompressor implements Compressor {
  @Override
  public void apply(String fileName) {
      System.out.println("應用jpeg壓縮演算法...");
  }
}

public class PngCompressor implements Compressor {
  @Override
  public void apply(String fileName) {
      System.out.println("應用png壓縮演算法...");
  }
}
複製程式碼

濾鏡演算法

public interface Filter {
  void apply(String fileName);
}
複製程式碼

2個濾鏡演算法的具體實現

public class BlackAndWhiteFilter implements Filter {
  @Override
  public void apply(String fileName) {
      System.out.println("應用blackAndWhite濾鏡");
  }
}

public class BackgroundBlurFilter implements Filter {
    @Override
    public void apply(String fileName) {
        System.out.println("應用backgroundBur濾鏡");
    }
}
複製程式碼

使用策略

    public static void main(String[] args) {
        var fileName = "test.jpg";
        var compressor = new JpegCompressor();
        var filter = new BlackAndWhiteFilter();

        handleUpload(fileName, compressor, filter);
    }

    public static void handleUpload(String fileName, Compressor compressor, Filter filter) {
        compressor.apply(fileName);

        filter.apply(fileName);
    }
複製程式碼

UML

1/24 設計模式之策略設計模式 Strategy Pattern

為什麼策略模式更好

1/24 設計模式之策略設計模式 Strategy Pattern

可以看到這裡個策略模式把具體的演算法實現單獨抽離到獨立的類中了,呼叫方流程更加清晰,同時,單獨的具體演算法實現類也更容易被複用

一些注意的點

每個策略的具體實現可以很複雜,通過封裝,使得這部分複雜的程式碼保持了獨立

策略物件由使用者進行建立並傳遞到處理方法中: handleUpload(String fileName, Compressor compressor, Filter filter)

參考資料

  1. java-design-patterns.com/patterns/st…
  2. docs.staruml.io/

相關文章