そう単純で、元の「ポリシーモード」

I.はじめにStrategyパターン

1.定義

戦略モード(戦略):一緒アルゴリズムパッケージのセット、それはお互いを置き換えることができるように、同時にアルゴリズムの変更は、顧客の使用には影響しません。

 2、使用シナリオ

カプセル化するために使用することができ、ルールのほぼすべてのタイプ彼らは分析中に様々なビジネスルールを適用し、異なる条件での必要性を聞くたびに、あなたは、この変化の可能性に対処するための戦略パターンを使用することを検討することができます

3、長所と短所

利点:

  • アルゴリズムは自由に切り替えることができます
  • 条件付きの複数使用しないでください(私たちは、複数の条件文を使用することがポリシーモードでない場合は、メンテナンスに助長されていません)
  • 拡張性は良いですが、ちょうどインターフェイスを実装するための戦略を追加します

短所:

  • 戦略は、クラスの数を増加し、各ポリシーは、クラス、再利用の非常に小さい可能性があります
  • すべてのクラスが露出外交政策に要求されます

図3に示すように、UMLクラス図

 


 第二に、戦略パターンの実装

1、政策の役割

 抽象的な政策の役割は、戦略、抽象的アルゴリズムの家族は、通常、インターフェイスのメソッドとプロパティを持っている必要があり、それぞれの戦略やアルゴリズムを定義しています。このアルゴリズムは、「アルゴリズム」という意味です。

package com.mfc.design.策略模式;

/**
 * @author MouFangCai
 * @date 2019/10/11 11:28
 */
public abstract class Strategy { // 算法方法 public abstract void algorithmInterface(); } 

2、具体的な戦略の役割

特定のアルゴリズムを達成するために、即ち、ポリシーを実装するための抽象操作は、底部がプリントで置き換えました。試験3 ConcreteStrategyのカテゴリ、および他の2つのクラスはConcreteStrategyA同様に、私は繰り返しません。

package com.mfc.design.策略模式;

/**
 * @author MouFangCai
 * @date 2019/10/11 11:31
 */
public class ConcreteStrategyA extends Strategy { @Override public void algorithmInterface() { System.out.println("这是算法A"); } } 

3、コンテキストコンテキスト

 また、コンテキストパッケージの役割と呼ばれるコンテキストのコンテキストの役割は、存在していてもよいパッケージング戦略、アルゴリズム、変化に対するシールド層モジュールの直接アクセスを接続する役割を果たしています。

package com.mfc.design.策略模式;

/**
 * @author MouFangCai
 * @date 2019/10/11 11:32
 */
public class Context { Strategy strategy; public Context (Strategy strategy) { // 初始化时,传入具体的策略对象 this.strategy = strategy; } // 上下文接口 public void ContextInterface() { // 根据具体的策略对象,调用就其算法的方法 strategy.algorithmInterface(); } } 

 4、クライアントのクライアント

package com.mfc.design.策略模式;

/**
 * @author MouFangCai
 * @date 2019/10/11 11:36
 */
public class Client_Strategy { public static void main(String[] args) { doStrategy("A"); doStrategy("B"); doStrategy("C"); } public static void doStrategy(String options){ Context context = null; switch (options){ case "A": context = new Context(new ConcreteStrategyA()); context.ContextInterface(); break; case "B": context = new Context(new ConcreteStrategyB()); context.ContextInterface(); break; case "C": context = new Context(new ConcreteStrategyC()); context.ContextInterface(); break; } } } 

結果は以下の通りであります:

これは、アルゴリズムAであり
Bがアルゴリズムであることを
アルゴリズムCであります

5、分析

図から分かるように、戦略パターンの使用新しいアルゴリズムの必要がある場合には、単にアルゴリズムの新しいタイプを追加し、次の更新クライアント側が選択することができますが、独自のアルゴリズムには影響しません。

同時に、我々は明らかにすることを見ることができ、クライアントは非友好的なクライアントのために、このようなプログラムを判断の多くを行っています。私たちは、コンテキスト、変換してみましょう、より良いプログラムを書く、「簡単な工場」のモデルと組み合わせを。

第三に、簡単な工場と組み合わせる戦略パターン

図1に示すように、変換後のコンテキスト

package com.mfc.design.策略模式;

/**
 * @author MouFangCai
 * @date 2019/10/11 11:32
 */
public class Context_Factory { Strategy strategy = null; public Context_Factory(String options) { // 初始化时,根据客户端不同的选择,实例化具体的策略对象 switch (options){ case "A": strategy = new ConcreteStrategyA(); break; case "B": strategy = new ConcreteStrategyB(); break; case "C": strategy = new ConcreteStrategyC(); break; } } // 上下文接口 public void ContextInterface() { // 根据具体的策略对象,调用就其算法的方法 strategy.algorithmInterface(); } } 

2、クライアントの変換後

package com.mfc.design.策略模式;

/**
 * @author MouFangCai
 * @date 2019/10/11 11:36
 */
public class Client_Strategy_Factory { public static void main(String[] args) { String options = "A"; Context_Factory a = new Context_Factory(options); a.ContextInterface(); } } 

「簡単な工場」+「ポリシーモード」を使用すると、クライアントコードはより簡潔な、見ることができます。しかし、またしても、親戦略アルゴリズムがクライアントに知らせていない、クライアントから特定のアルゴリズムが完全に独立します。

シンプルなファクトリパターン、お読みください参考https://blog.csdn.net/qq_36095679/article/details/89256921

 

おすすめ

転載: www.cnblogs.com/moufangcai/p/11654222.html