米国のデザインパターン - 戦略パターン

戦略モード

戦略パターンとは何ですか

  ポリシーモデルは、アルゴリズムのセットのために意図され、各アルゴリズムは、別のクラスにカプセル化され、彼らはお互いを置き換えることができるように、共通のインタフェースを持っています。ポリシーモードの変更は、アルゴリズムは、クライアントの状況に影響を与えることができない可能

戦略モードアルゴリズムのパッケージであり、およびアルゴリズムは、アルゴリズム自体を離れて使用しての責任です。戦略パターンは、抽象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

 

おすすめ

転載: www.cnblogs.com/yeshensi/p/11684532.html