如何在Java中使用列舉實現策略模式?


策略模式是一種屬於行為型模式的設計模式。它允許開發人員定義一組演算法,為每個演算法建立一個單獨的類,並在執行時根據需要更改它們。Java提供了多種實現策略模式的方法;列舉是我們案例中常用的方法。當您需要建立表示程式邏輯中不同策略的固定常量列表時,列舉非常有用。

為了使用策略模式輕鬆地在Java中切換不同的策略,定義一個表示這些策略的列舉是一種簡潔明瞭的方法。透過選擇合適的列舉常量,這種方法允許在各種選項之間進行無縫切換。

列舉

Java中的列舉是一種獨特的資料型別,包含一組固定的常量。它提供建立在列舉型別內相互排斥的值的能力,這些值可以被稱為列舉常量。此特殊功能使您可以定義命名值,使您的程式碼更具可讀性和簡潔性。

enum DayOfWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

名為DayOfWeek的列舉型別是一個示例,它表示一週中的所有七天。它包括Monday、Tuesday、Wednesday、Thursday、Friday、Saturday和Sunday作為常量。在整個程式碼庫中,使用者可以訪問列舉型別中這些預定義的值。

方法

有多種方法可以使用Java中的列舉實現策略模式。以下兩種方法很常見:

  • 帶有抽象方法的列舉

  • 帶有函式式介面的列舉

帶有抽象方法的列舉

在帶有抽象方法的列舉中,每個列舉常量都會重寫列舉中宣告的抽象方法。這允許每個常量提供其自身的策略實現。抽象方法充當所有列舉常量必須滿足的契約,確保每個常量都定義了其所代表策略所需的行為。

演算法

  • 定義一個列舉來表示策略。

  • 在列舉中宣告一個抽象方法來表示策略行為。

  • 在列舉中建立列舉常量,每個常量都使用其獨特的策略實現來實現抽象方法。

  • 抽象方法充當所有列舉常量必須滿足的契約,確保每個常量都定義了所需的行為。

  • 客戶端程式碼可以透過呼叫相應列舉常量上的抽象方法來訪問所需的策略。

  • 可以透過選擇不同的列舉常量來切換策略實現。

  • 這種方法提供了一種清晰一致的方式來定義和執行列舉中的策略。

示例

enum CalculationStrategy {
   ADDITION {
      @Override
      public int calculate(int a, int b) {
         return a + b;
      }
   },
   SUBTRACTION {
      @Override
      public int calculate(int a, int b) {
         return a - b;
      }
   };

   public abstract int calculate(int a, int b);
}

public class Main {
   public static void main(String[] args) {
      int a = 10;
      int b = 5;

      CalculationStrategy strategy = CalculationStrategy.ADDITION;
      int result = strategy.calculate(a, b);
      System.out.println("Addition Result: " + result);

      strategy = CalculationStrategy.SUBTRACTION;
      result = strategy.calculate(a, b);
      System.out.println("Subtraction Result: " + result);
   }
}

輸出

Addition Result: 15
Subtraction Result: 5

帶有函式式介面的列舉

帶有函式式介面的列舉將函式式介面的一個例項與每個列舉常量關聯。函式式介面定義一個表示策略行為的單一方法。每個列舉常量都使用實現函式式介面方法的lambda表示式或方法引用進行初始化。這種方法提供了一種簡潔的方式,可以使用函數語言程式設計概念在列舉中定義和執行策略。

演算法

  • 定義一個列舉來表示策略。

  • 建立一個函式式介面,宣告一個表示策略行為的單一方法。

  • 將函式式介面的一個例項與每個列舉常量關聯。

  • 使用實現函式式介面方法的lambda表示式或方法引用初始化每個列舉常量。

  • 客戶端程式碼可以透過呼叫相應列舉常量上函式式介面的方法來執行所需的策略。

  • 可以透過選擇不同的列舉常量輕鬆切換策略實現。

  • 這種方法利用函數語言程式設計概念,在列舉中提供簡潔靈活的策略實現。

示例

enum CalculationStrategy {
   ADDITION((a, b) -> a + b),
   SUBTRACTION((a, b) -> a - b);

   private final CalculationOperation operation;

   CalculationStrategy(CalculationOperation operation) {
      this.operation = operation;
   }

   public int calculate(int a, int b) {
      return operation.operate(a, b);
   }

   interface CalculationOperation {
      int operate(int a, int b);
   }
}

public class Main {
   public static void main(String[] args) {
      int a = 10;
      int b = 5;

      CalculationStrategy strategy = CalculationStrategy.ADDITION;
      int result = strategy.calculate(a, b);
      System.out.println("Addition Result: " + result);

      strategy = CalculationStrategy.SUBTRACTION;
      result = strategy.calculate(a, b);
      System.out.println("Subtraction Result: " + result);
   }
}

輸出

Addition Result: 15
Subtraction Result: 5

結論

在本教程中,使用帶有抽象方法的列舉或帶有函式式介面的列舉在Java中實現的策略模式提供了一種結構化且靈活的方法來定義和切換不同的策略。它允許乾淨的程式碼組織,促進程式碼重用,並允許輕鬆擴充套件策略。抽象方法和函式式介面的選擇取決於具體的需要和編碼風格偏好,提供了實現所需策略行為的不同方法。

更新於:2023年7月25日

瀏覽量1K+

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告