戦略パターン


戦略パターンでは、クラスまたはそのアルゴリズムの動作を実行時に変更できます。このタイプの設計パターンは動作パターンです。

戦略パターンでは、さまざまな戦略を表すオブジェクトと、戦略オブジェクトの変化に応じて動作が変化するコンテキスト オブジェクトを作成します。ストラテジ オブジェクトは、コンテキスト オブジェクトの実行アルゴリズムを変更します。

はじめに

目的: 一連のアルゴリズムを定義し、それらを 1 つずつカプセル化し、交換可能にします。

主な解決策: 類似したアルゴリズムが複数ある場合に if...else を使用することによって生じるメンテナンスの複雑さと困難。

いつ使用するか: システムには非常に多くのクラスがあり、それらを区別するのはその直接の動作です。

解決方法: これらのアルゴリズムを 1 つずつクラスにカプセル化し、任意に置き換えます。

キーコード: 同じインターフェースを実装します。

応用例: 1. 諸葛孔明のヒント、それぞれのヒントは戦略です。 2. 移動方法、自転車か車を選択 それぞれの移動方法が戦略です。 3. JAVA AWT の LayoutManager。

利点: 1.アルゴリズムを自由に切り替えることができます。 2. 複数の条件判断を使用しないでください。 3. 優れた拡張性。

デメリット: 1. 戦略のカテゴリが増加します。 2. すべての戦略クラスを外部世界に公開する必要があります。

使用シナリオ: 1. システム内に多数のクラスがあり、それらの違いがその動作のみである場合、戦略パターンを使用すると、オブジェクトが多数の動作の中から 1 つの動作を動的に選択できるようになります。 2. システムは、いくつかのアルゴリズムから 1 つを動的に選択する必要があります。 3. オブジェクトに多くの動作があり、適切なパターンがない場合は、複数の条件付き選択ステートメントを使用してこれらの動作を実装する必要があります。

注: システムに 4 つを超えるストラテジーがある場合は、ストラテジー クラスの拡張の問題を解決するために混合モードの使用を検討する必要があります。

実装

アクティビティを定義するStrategyインターフェースと、Strategyインターフェースを実装するエンティティ戦略クラスを作成します。 Contextは、特定の戦略を使用するクラスです。

StrategyPatternDemo のデモ クラスは、Context と戦略オブジェクトを使用して、戦略が設定または使用されるときにコンテキストの動作が変化することを示します。

strategy_pattern_uml_diagram.jpg

ステップ 1

インターフェースを作成します。

Strategy.java

public interface Strategy {
   public int doOperation(int num1, int num2);
}

ステップ 2

インターフェースを実装するエンティティクラスを作成します。

OperationAdd.java

public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

OperationSubstract.java

public class OperationSubstract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

OperationMultiply.java

public class OperationMultiply implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}

ステップ 3

Contextクラスを作成します。

Context.java

public class Context {
   private Strategy strategy;

   public Context(Strategy strategy){
      this.strategy = strategy;
   }

   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

ステップ 4

Contextを使用して、戦略Strategyを変更したときに動作がどのように変化するかを確認します。

StrategyPatternDemo.java

public class StrategyPatternDemo {
   public static void main(String[] args) {
      Context context = new Context(new OperationAdd());		
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

      context = new Context(new OperationSubstract());		
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

      context = new Context(new OperationMultiply());		
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

ステップ 5

出力を確認します。

りー