戦略モード
まず、定義
アルゴリズムのセットを定義し、各アルゴリズムは、一緒に包装され、それらは前に相互に変換することができるようになっています。(各1をカプセル化し、アルゴリズムのファミリーを定義し、それらを交換します。)
第二に、理解
彼らはお互いを置き換えることができるように別々の抽出挙動は、単独で、それぞれのインタフェースの定義を変更し、対応する動作をカプセル化します。
1.コンテキストコンテキストの役割
高レベル戦略淀アルゴリズムへの直接アクセスを遮断役割を、接続パッケージので、パッケージが変更される可能性
2.戦略戦略インタフェース
ポリシーのインターフェイスを定義
3. ConreteStrategy具体的な戦略
特定のアルゴリズムをカプセル化するための実装戦略インターフェース
第三に、たとえば、
3.1)ポリシーを定義するためのインタフェース
/ ** *策略 * @author TimFruit * @date 2019年5月21日7時40分 * / パブリック インターフェイスIAlgorithm { INT doOperate(INT NUM1、INT NUM2)。 }
3.2)インターフェイスの実装戦略
パブリック クラスの追加を実装しIAlgorithm { @Override 公共 int型 doOperate(int型 NUM1、int型からnum2){ 戻り NUM1 + NUM2を。 } }
パブリック クラス乗算を実装IAlgorithm { @Override 公共 INT doOperate(INT NUM1、INT NUM2){ 戻り NUM1の*のNUM2と、 } }
3.3)を達成コンテキスト
/ ** *上下文、承载算法 * * @author TimFruit * @date 2019年5月21日午前8時03分 * / パブリック クラス電卓{ IAlgorithmアルゴリズム。 公共電卓(IAlgorithmアルゴリズム){ この .algorithm = アルゴリズム。 } 公共 int型 EXEC(INT NUM1、INT NUM2){ 戻りalgorithm.doOperate(NUM1、NUM2)を、 } }
3.4)テストシナリオ
パブリック クラスクライアント{ 公共 静的 ボイドメイン(文字列[]引数){ IAlgorithmアルゴリズム = 新規追加(); 電卓電卓 = 新しい電卓(アルゴリズム)。 int型 NUM1 = 1 ; int型からnum2 = 3 ; int型の結果= calculator.exec(NUM1、NUM2)。 System.out.println( "结果为:" + 結果)。 } }
四のディアン戦略の列挙
/ ** *戦略の列挙 * *非常に良いが、一般的に役割が頻繁に変更されないため、限られたため、列挙型(非常に悪いT_Tを拡張)の * * @author TimFruit * 8 @date 2019年5月21日:12である * / パブリック 列挙 電卓{ ADD { @Override INT Execの(INT NUM1、INT NUM2){ 戻り NUM1 + NUM2; } }、 SUBは{ @Override INT Execの(INT NUM1、INT NUM2){ 戻り num1- 、NUM2を } } 、 MULTIPLY { @Override INT EXEC(INT NUM1、INT NUM2){ 戻り NUM1の*のNUM2。 } }。 抽象 int型のexec(int型 NUM1、int型からnum2); }
テスト環境:
パブリック クラスクライアント{ 公共 静的 ボイドメイン(文字列[]引数){ int型 NUM1 = 1 。 int型からnum2 = 3 ; int型の結果= Calculator.ADD.exec(NUM1、NUM2)。 System.out.println( "结果为:" + 結果)。 } }
教材:
<禅デザインパターン>