戦略モード(Strategyパターン)
まず、戦略パターンのシナリオ
次のように戦略モードアプリケーションのシナリオは次のとおりです。
- システムは、クラスをたくさん持っている、との唯一の違いは、彼らは異なる挙動を示すということです。
- 動的にAアルゴリズムを集中システムを選択します
第二に、実現は、事業戦略のシーンモードの方法でのお支払いを選択しました
あなたは、支払いでのお支払い方法のみんなを選択し、ユーザが選択していない場合、システムは支払決済のデフォルトの方法を使用するよう要求されたときに一般的なシナリオです。ここでは、このビジネスシナリオをエミュレートするための戦略パターンを使用します。
/ ** *仕様規定され、支払いや決済ロジック * / パブリック 抽象 クラスのお支払い{ // 支払いタイプ パブリック 抽象文字列のgetName(); // チェック残高 保護 抽象 ダブルqueryBalance(文字列UID); // デビット決済 公共 PayStateペイ(文字列は、uidをダブル量){ IF(queryBalance(UID)< 量){ 返す 新しい新しい、 "支払いが失敗した"は、 "バランスの欠如"、500(PayStateを); } を返す 新しい新 PayState(200 "成功した支払い"、「支払金額を: 「+のAMOUNT); } }
デビットは何かのシンプルなロジックを実行するために支払いました。
/ ** *支払ロジック * / パブリック クラスPayState { プライベート int型のコード、 プライベートオブジェクトデータ; プライベート文字列MSG; 公共 PayState(int型コード、MSG文字列、文字列データ){ この .CODE = コード; この .dataセクション= データ; この = .MSGのMSG; } パブリック文字列のtoString(){ リターン( "支払い状況:[" +コード+ "] " + MSG + " 取引の詳細:" + データ); } }
支払いの2種類を定義します。
/ ** * Alipayの * / パブリック クラス Alipayの延び支払い{ @Override パブリック文字列のgetName(){ リターン "Alipayのを" ; } @Overrideは、 保護された ダブルqueryBalance(文字列UID){ リターン 900 ; } } / ** *マイクロチャネル支払い * / パブリック クラスは WechatPay 延び支払い{ @Override パブリック文字列のgetName(){ 戻り「マイクロペイメント文字」; } @Override 保護された 二重queryBalance(文字列UID){ リターン 256 。 } }
有料ポリシー管理クラス
/ ** *支付策略管理类 * / パブリック クラスPayStrategy { パブリック 静的 最終列ALI_PAY = "Alipayの" 。 公共の 静的な 最終文字列WECHAT_PAY =「WechatPay」を。 公共の 静的な 最終文字列DEFAULT_PAY = ALI_PAY。 プライベート 静的な地図<文字列、お支払い> payStrategy = 新しい HashMapの<> (); 静的{ payStrategy.put(ALI_PAY、新しいAlipayの())。 payStrategy.put(WECHAT_PAY、新しいWechatPay()); } パブリック 静的の支払GET(文字列payKey){ 場合(!payStrategy.containsKey(payKey)){ リターンpayStrategy.get(DEFAULT_PAY)。 } 戻りpayStrategy.get(payKey)を、 } }
注文の作成:支払いとしてオーダーの支払いの際にはなっていると、コレクション内のキーによって得ることができるように、スイッチはありませんし、他の場合は、繰り返されます
/ ** *订单类 * / パブリック クラスの注文{ プライベート文字列は、UID。 プライベート文字列の注文ID。 プライベートダブル額。 公共注文(文字列は、文字列注文ID、二量UID){ この .UID = UID。 この .orderId = 注文ID; この .amount = 量; } // 完美解决了スイッチ的过程、不需要写スイッチ和あれば...他にあれば 公衆PayState有料(){ リターン有料(PayStrategy.DEFAULT_PAY)。 } 公共の PayStateペイ(文字列payKey){ 支払決済 = PayStrategy.get(payKey); System.out.printlnは( "ようこそ:" + payment.getName()); System.out.printlnは( "この取引はに達した:"担当、+量+」 ... " ); 戻りpayment.pay(UID、金額); } }
テストカテゴリ:
パブリック クラスPayStrategyTest { 公共の 静的な 無効メイン(文字列[] args)を{ // 順序を作成 オーダオーダ= 新新秩序( "1"、 "202 001 080 001"、324.45は); // 選択のお支払い:アリペイ のSystem.out.println( order.pay(PayStrategy.ALI_PAY)); } }
第三に、ソースコードに反映ストラテジパターン
アプリケーション1.JDK
:より一般的なコンパレータを初めて目--compareインタフェース、一般的に使用される比較()メソッドは、共通の戦略を達成するための抽象的なパターンで、以下のコンパレータのインターフェースが実現するクラスをたくさん持っている、私たちのような、着信仕分け戦略としてコンパレータインタフェースを実現します
パブリック 静的 <T> ボイド parallelSort(T []、コンパレータ<?スーパー T> CMP){ 場合(CMP == NULL ) 、CMP = NaturalOrder.INSTANCE。 INT、N = a.length、P、G。 もし(N <= MIN_ARRAY_SORT_GRAN || (P = ForkJoinPool.getCommonPoolParallelism())== 1 ) TimSort.sort( 0、N、CMP、NULL、0、0 ); 他の 新しい ArraysParallelSortHelpers.FJObject.Sorter <T> (nullで、 (T [])Array.newInstance(a.getClass()。getComponentType()、n)は、 0、nは、0、((G = N /(P << 2))<= MIN_ARRAY_SORT_GRAN)? MIN_ARRAY_SORT_GRAN:G、CMP).invoke(); }
そこコンストラクタTreeMapのクラス:
公共のTreeMap(コンパレータ<?スーパー K> コンパレータ){ この .comparator = コンパレータ。 }
2.Springソースアプリケーション
唯一の戦略、異なる初期化戦略を持つクラスの異なる種類の春の初期化モード。
パブリック インターフェースInstantiationStrategy { オブジェクトのインスタンス化(RootBeanDefinition VAR1、文字列VAR2、VAR3たBeanFactory)はスローBeansExceptionと、 オブジェクトのインスタンス化(RootBeanDefinition VAR1、文字列VAR2、VAR3たBeanFactory、コンストラクタ <?> VAR4、オブジェクト... VAR5)はスローBeansExceptionを。 オブジェクトのインスタンス化(RootBeanDefinition VAR1、文字列VAR2、VAR3たBeanFactory、オブジェクトVAR4、方法VAR5、オブジェクト... var6)がスローBeansExceptionと、 }
長所と短所第四に、戦略パターン
戦略パターンの利点は以下の通り:
- 開閉の原則に沿った戦略パターン。
- それ以外の場合は戦略モードは、スイッチなど、複数の条件文の使用を避けることができます。
- 戦略パターンは、アルゴリズムの機密性とセキュリティを向上させることができます使用してください。
戦略パターンのデメリット次のように:
- クライアントが使用するクラスを決定するために、すべての戦術と戦略を知っている必要があります。
- コードは、コードを維持することの難しさを増加させ、戦略カテゴリの多くを生成します。
第五に、デリゲートモデルと戦略モード統合されたアプリケーション
委任モード:コントローラは、URLに対応するとのDispatcherServletに従って戦略パターン製の容器に入れて、他の場合。