定義
アルゴリズムを定義し、各アルゴリズムをカプセル化して、それらを交換可能にします。一種の行動パターンです。
例
わかりやすくするために、さまざまな国の税率の計算を例として取り上げます。
現在、私たちのプログラムは中国と米国の税率の計算しかサポートできないとします。
1 public class Tax_Cal { 2 3 public int CN_Cal(int x){ // 中国の税金を計算する 4 5 } 6 7 public int US_Cal(int x){ // 米国の税金を計算する 8 9 } 10 }
このように書いても問題はないようですが、実際に考えて、将来的に拡大してフランス、日本、その他の国をサポートする必要がある場合、このカテゴリを常に変更する必要がありますが、特に面倒で危険ですか?たとえば、以前の国と競合している場合、それは以前の計算に影響します。
したがって、これらを個別に記述し、すべての国税計算を分離します同じインターフェースの実装にはすべて共通のパラメーターxがあります。
1 public クラス Strategy { // 戦略モード 2 public int Cal(int x); 3 } 4 5 public クラス CN_Tax は Strategy { // 中国の税計算インターフェイスを実装します 6 7 @Override 8 public int Cal(int x){ 9 10 } 11 } 12 13 パブリック クラス US_Tax は Strategyを実装します { // US税計算インターフェイスを実装します 14 15 @jOverride 16 public int Cal(int x){ 17 18 } 19 } 20 21 public class Tax_Cal { // 税計算クラス 22 23 private Strategy =戦略; // 戦略を定義する 24 25 public void setStrategy(戦略戦略) { // アクセス戦略 26 this .strategy = strategy; 27 } 28 29 public int getTax(int x){ // 結果を取得 30 return this .strategy.cal 31 } 32 }
このように、すべての税計算は互いに影響し合うことはありません。計算は私たちから独立しているためです。どの国の税を計算するかは、その国のアルゴリズムにアクセスしてgetTaxを呼び出すだけで済みます。書きましょう:
1 public class Test { 2 public static void main(string [] args){ 3 Tax_Cal tax_cal = new Tax_Cal(); // インスタンス化されたオブジェクト 4 tax_cal.setStrategy(new CN_Tax()); // 中国の税計算へのアクセス 5 int res = tax_cal.getTax(100); // 結果を取得 6 } 7 }
要約:
利点:
1.戦略はすべて同じ抽象化を実装しているため、戦略を自由に切り替えることができます。
2.簡単に拡張でき、基本的に元のコードを変更せずに拡張できます。
3.複数の条件ステートメントを使用しないでください。そうしないと、維持する必要があり、ケースを切り替えます。これは、メンテナンスには非常に好ましくありません。
ストラテジーモードはシンプルで一般的に使用されるデザインモードであり、通常は単独で使用するのではなく、他のモードと組み合わせて使用します。