戦略モード
戦略パターンとは何ですか
ポリシーモデルは、アルゴリズムのセットのために意図され、各アルゴリズムは、別のクラスにカプセル化され、彼らはお互いを置き換えることができるように、共通のインタフェースを持っています。ポリシーモードの変更は、アルゴリズムは、クライアントの状況に影響を与えることができない可能
戦略モードアルゴリズムのパッケージであり、およびアルゴリズムは、アルゴリズム自体を離れて使用しての責任です。戦略パターンは、抽象Policyクラスのサブクラスとして、クラス内の戦略のシリーズをパッケージ化するために、通常は一連のアルゴリズムです。
例えば、チェス、戦略フォワード銃、馬、兵士が同じ戦略ではなく、アルゴリズムが異なっています。
我々は、超簡単なチェス(チェスをプレイするのは簡単ではない、笑)、の一例として、上図行い、問題を説明するために、戦闘を開始することを想定し、以下のように今はチェスの銃、兵士、コードがあります。
1つの パブリック クラスチェス{ 2 。3 / ** 。4 *アルゴリズム進む兵士 。5 * @param インサイチュ 。6 * @paramのB目標 7 * / 8 公共 ボイド soldierGoAhead(int型 A、int型B){ 9 のSystem.out.println ( "兵士" + A + + "に" B); 10 } 11 12することである / ** 13れる *アルゴリズムが進行するガン 14 * @param Aインサイチュ 15 * @paramのB標的 16 * / 17 公共 ボイド gunGoAhead(INT A、INT B){ 18 のSystem.out.println( "炮" + A + "进" + B)。 19 } 20 }
あなたは書くことができますか?このアルゴリズムは、そのような馬のルールを歩いて、歩いなど、のようなルールが増加している場合は、チェスのクラスを変更し続けてきたように、その中には死を求める意味します。
私たちは、コードを書き換えるための戦略モードで始まります。
抽象戦略インタフェース:
1つの パブリック インターフェイス戦略{ 2 3。 / ** 4。 *ポリシー進む 5。 * @param インサイチュ 6。 * @paramのB標的部位 7。 * / 8。 公共 ボイド GoAhead(int型 A、int型B); 9 10 / ** 11 *ポリシーレベル 12である * @param インサイチュ 13は * @paramのB標的部位 14 * / 15 公共 ボイドストレート(int型、Aint型のB)。 16 }
ウォーキング戦略銃を実装します。
1 パブリック クラス GunStrategy 実装の戦略{ 2 。3 / ** 。4 *ガンポリシー進む 。5 * @param インサイチュ 。6 * @paramのBの標的部位 。7 * / 8 @Override 。9 公共 ボイド GoAhead(int型 A、int型B)を{ 10 (+ "へ" "ガン" + A +のSystem.out.println B); 11 } 12は、 13である / ** 14 *ガンポリシーレベルは、 15 * @param インサイチュ 16 * @param Bの標的部位 。17 * / 18である @Override 。19 公共 ボイドストレート(int型 A、int型B){ 20である のSystem.out.println( "ガン" + A + "フラット" + ; B) 21である } 22です }
政策実施の兵士を歩きます:
1 パブリック クラス SoldierStrategy 実装の戦略{ 2 。3 / ** 4 *兵士ポリシーに 5 * @param インサイチュ 。6 * @paramのBの標的部位 。7 * / 8 @Override 。9 公共 ボイド GoAhead(int型 A、int型B)を{ 10 IF(== BA 1 ){ 11 のSystem.out.println( "兵士" + A + + "に" B); 12である } 他{ 13であります System.out.println( "私は兵士午前、私は後方ない前方に移動することができる。" ); 14 } 15 } 16 17 / ** 18 *レベル戦略の兵士 19 * @param 場所 20 *の@param B目標レベル 21 * / 22である @Override 23は 公共 ボイド(ストレートint型 A、int型の{B) 24 IF(== BA 1 ){ 25 のSystem.out.println( "兵士" + A + "フラット" + B); 26である } 他{ 27 System.out.println( "私は兵士だ、私は一段のpingを行くことができる" ); 28 } 29 } 30 }
テスト:
1 パブリック クラスChessTest { 2 。3 公共 静的 ボイドメイン(文字列[]引数){ 4つの。 チェスチェス= 新しい新しいチェス(); // インスタンスチェス 。5 chess.setStrategy(新しい新しい GunStrategy()); // アクセス実装ガン戦略 6 chess.straight(5、8); // フラット行くための銃 7 8 chess.setStrategy(新新 SoldierStrategyは()); // アクセス兵士の実装戦略 9 chess.straight(5、8); // ビングは、フラット行く 10 11 (chess.setStrategyを新しい新しい SoldierStrategy()); // アクセスポリシー実施兵士 12は chess.straight(5,6); // 兵士が平坦行く 13 } 14 }
結果:
1つの 銃5は、描画し、8 2 、私は兵士だ、私は一歩レベルに行くことができる 3、兵士5は引き分けと6