戦略パターンは、Java の 23 の動作パターンの 1 つです。まず、戦略パターンが何であるかを見てみましょう。
戦略パターンの定義:
この設計パターンは、一連のアルゴリズムをカプセル化して、アルゴリズムの変更はクライアントの使用には影響しません。戦略パターンはオブジェクトの動作パターンに属し、アルゴリズムをカプセル化し、アルゴリズムの使用責任をアルゴリズムの実装から分離し、これらのアルゴリズムの管理を別のオブジェクトに委任します。
実際、実生活では、特定の目標を達成するために複数の戦略から選択できる状況によく遭遇します。たとえば、旅行するときは、飛行機に乗ったり、電車に乗ったり、自転車に乗ったり、または自分の専用車を運転することもできます。 または、たとえば、オンライン ショッピングの場合、中国工商銀行、中国農業銀行、中国建設銀行などを選択できますが、提供されるアルゴリズムはすべて同じであり、支払いを支援します。
ソフトウェア開発でも同様の状況に遭遇することがありますが、ある機能を実装するために複数のアルゴリズムや戦略がある場合、さまざまな環境や条件に応じて、異なるアルゴリズムや戦略を選択して機能を完成させることができます。関数。
利点:
クライアントは、すべての戦略アルゴリズムの違いを順番に理解する必要があります。適切なタイミングで適切なものを選択するため アルゴリズム クラス
構造図:
4. コードの実装
ここでアヒルの親クラスを定義します:
吠え声と外観のメソッドがあります。それぞれ異なるため、サブクラスで書き直す必要があります)飛行することもできます (ここでは戦略モードが使用されます)
public abstract class duck { //鸭子都会叫: public void quack(){ System.out.println("嘎嘎嘎"); } //鸭子的外观,因为都不一样,所以由子类去实现 public abstract void display(); //以下使用策略模式: //在父类中持有该接口,并由该接口代替飞行行为(组合) private Flying flying; //提供set方法 public void setFlying(Flying flying) { this.flying = flying; } public void fly(){ flying.Fly(); } }飛行インターフェイスを定義します:
/** * 策略接口:实现了鸭子的飞行行为 */ public interface Flying { void Fly(); }ストラテジー モードでは、使用する必要があるアルゴリズムをカプセル化することがわかっており、flying と ## を別の
package## にカプセル化します。 # #Cannot Fly の 2 つのメソッド: Can fly (上記のフライト インターフェイスに継承され、フライト メソッドをオーバーライド):
public class FlyWithWin implements Flying { @Override public void Fly() { System.out.println("我会飞"); } }
Can 't fly:
public class FlyNoWay implements Flying { @Override public void Fly() { System.out.println("我不会飞行"); } }
注: 上記の 2 つのメソッドをアルゴリズム ファミリとして個別にカプセル化し、プログラムがいずれかのアルゴリズムを使用する必要がある場合、プログラムはアルゴリズムの最終的な効果は同じであるため、アルゴリズムの変更の影響を受けません。
赤い羽根のアヒル:
/** * 红色鸭子 */ public class RedDuck extends duck{ public RedDuck(){ super(); //给鸭子注入飞行的能力,这里就是通过算法族里面的会飞的算法 super.setFlying(new FlyWithWin()); } @Override public void display() { System.out.println("我是红色的鸭子"); } }
緑の羽根のアヒル:
/** * * 绿色鸭子 */ public class GreenDuck extends duck{ public GreenDuck(){ super(); //给鸭子注入飞行的能力,这里也是通过算法族里面的会飞的算法 super.setFlying(new FlyWithWin()); } @Override public void display() { System.out.println("我是绿色的鸭子"); } }
小さなアヒルの種類 (飛べない):
/** * 小鸭子,还不会飞 */ public class SamllDuck extends duck{ public SamllDuck(){ super(); //小鸭子不会飞,所以使用了算法族里面不会飞的算法 super.setFlying(new FlyNoWay()); } @Override public void display() { System.out.println("我还是小鸭子"); } //因为小鸭子和大鸭子的叫声不一样,所以重写叫声方法 public void quack(){ System.out.println("嘎~嘎~嘎"); } }
テストの種類:
public class Test { public static void main(String[] args) { System.out.println("***测试鸭子程序***"); duck d = null; //这下面是轮流运行!!!! d = new RedDuck(); //测试红色的鸭子 d = new GreenDuck(); //测试绿色的鸭子 d = new SamllDuck(); //测试小鸭子 d.display(); d.quack(); d.fly(); System.out.println("***测试完毕***"); } }##オブジェクトとしての赤いアヒル:
##***アヒル プログラムのテスト***
私は赤いアヒルですクワック私は飛べます ***テスト完了***
マガモをオブジェクトとして使用する場合:***测试鸭子程序*** 我是绿色的鸭子 嘎嘎嘎 我会飞 ***测试完毕***
コガモをオブジェクトとして使用する場合 オブジェクトの場合:
***テストアヒルプログラム***
私はまだ小さなアヒルですqua~qua~qua私は飛べません* **テスト完了***
3. システム内のアルゴリズムが互いに完全に独立しており、特定のアルゴリズムの実装の詳細を顧客から隠す必要がある場合5. 戦略モードのアプリケーション シナリオ
1. システムが複数のアルゴリズムのうち 1 つを動的に選択する必要がある場合、それぞれのアルゴリズムは、 Strategy クラス
2. クラスは複数の動作を定義しており、これらの動作は、このクラスの操作で複数の条件ステートメントの形式で表示されます。各条件分岐はそれぞれのストラテジ クラスに移動できます。ステートメントは置き換えることができます
4. アルゴリズムを使用する顧客が操作対象のデータを知られないようにシステムが要求する場合、戦略パターンを使用してアルゴリズムに関連するデータ構造を隠すことができます
5. の唯一の違いは複数のクラスはそれぞれ異なるパフォーマンス動作を示します。戦略パターンを使用して、実行時に実行する特定の動作を動的に選択できます
以上がコードを使用して Java の戦略パターンを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。