軟體設計模式白話文系列(十四)策略模式

Eajur發表於2022-11-23

1、模式描述

定義一個演算法的系列,將其各個分裝,並且使他們有互動性。策略模式使得演算法在使用者使用的時候能獨立的改變。

在 Java 中,從 JDK1.8 開始支援函數語言程式設計,就是策略模式的一種體現,且無需藉助額外的類和介面,程式碼更加簡潔。

2、模式結構

  • 抽象策略類:定義策略演算法的規範。
  • 具體策略類:實現抽象策略類,提供具體的演算法實現或行為。
  • 環境類:持有抽象策略類的引用,由客戶端構造時,客戶制定具體使用策略類。

3、實現邏輯

定義一個抽象類或介面(抽象策略類),定義出演算法或行為規範;再實現多個具體策略類;定義環境類持有抽象引用;在客戶端呼叫動態選擇策略。

4、實戰程式碼

模擬建立證照時使用不同演算法建立金鑰。

/**
 * 抽象策略類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 18:11:19
 */
public interface KeyAlgorithm {
    void getAlgorithm();
}

/**
 * 具體策略類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 18:13:26
 */
public class RsaAlgorithm implements KeyAlgorithm {

    @Override
    public void getAlgorithm() {
        System.out.print("使用 RSA 演算法");
    }
}

/**
 * 具體策略類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 18:13:26
 */
public class Sm2Algorithm implements KeyAlgorithm {
    @Override
    public void getAlgorithm() {
        System.out.print("使用 SM2 演算法");
    }
}

/**
 * 具體策略類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 18:13:26
 */
public class EcdsaAlgorithm implements KeyAlgorithm {
    @Override
    public void getAlgorithm() {
        System.out.print("使用 ECDSA 演算法");
    }
}

/**
 * 環境類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 18:16:42
 */
public class Certificate {
    private KeyAlgorithm keyAlgorithm;

    public Certificate(KeyAlgorithm keyAlgorithm) {
        this.keyAlgorithm = keyAlgorithm;
    }

    public void creatCertificate() {
        keyAlgorithm.getAlgorithm();
        System.out.println("建立證照");
    }
}

/**
 * 測試類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-16 18:22:13
 */
public class Client {
    public static void main(String[] args) {
        new Certificate(new Sm2Algorithm()).creatCertificate();
        new Certificate(new RsaAlgorithm()).creatCertificate();
        new Certificate(new EcdsaAlgorithm()).creatCertificate();
    }
}

將建立證照時生成金鑰使用的演算法控制權交與客戶端。

5、適用場景

  • 需要在執行時,動態選擇物件內演算法。
  • 需要客戶端呼叫時自主選擇演算法。

6、策略模式和橋接模式區別

策略模式屬於物件行為型模式,而橋接模式屬於結構型模式。

兩種模式都存在一個物件使用聚合的方式引用另一個物件的抽象介面的情況,而且介面的實現可以有多種提供給客戶端選擇。但相對於策略模式,橋接模式表示的內容更多,結構更復雜,主要目的實現介面隔離原則,即把本質上並不內聚的兩種體系區分開來,而策略模式只是演算法的層次,沒有達到體系層次。從結構上看,橋接模式是包括策略模式,可以看成策略模式的 Plus 版。

6、策略模式和模版模式區別

策略模式屬於物件行為模式,基於組合機制,在物件層次運作,允許在執行時切換行為。

模版方法模式屬於類行為模式,基於繼承機制,允許透過擴充套件子類的部分內容來改變部分演算法。

模版方法是調整流程中部分演算法或流程的處理,策略模式前調完全替換整個演算法。

相關文章