23、設計モード——23、策略モード剖析及び集合フレームワークにおける応用


ポリシーモード(Strategy Pattern)
2つの非常に基本的なオブジェクト向け設計の原則を体現している:カプセル化の変化の概念とプログラミングの中でインタフェースを使用して、インタフェースの実現ではありません.
1、策略モードの定義:
アルゴリズムのセットを定義し、各アルゴリズムをカプセル化し、互いに交換できるようにします.ポリシー・モードは、これらのアルゴリズムがクライアントが呼び出すときに互いに影響しない変化を可能にする.
2、策略モードの意義:
ポリシーモードにより、開発者は多くの代替可能な部分からなるソフトウェアを開発することができ、各部分間は弱い接続の関係である.弱い接続の特性はソフトウェアにもっと強い拡張性を持って、メンテナンスしやすいです;さらに重要なのは、ソフトウェアの再利用性を大幅に向上させることです.
3、策略モードの構成
-抽象ポリシーロール:通常、インタフェースまたは抽象クラスによって実装されるポリシークラス.Comparatorインタフェースに対応
-具体的なポリシーロール:関連するアルゴリズムと動作がパッケージされています.私たち自身が書いたMyComparatorクラスのようなComparatorの実装に対応しています
-環境ロール:ポリシークラスの参照を持ち、最終的にクライアントに呼び出されます.TreeSetまたはTreeMapに対応し、コンパレータを構築します.つまり、ポリシークラスの参照があります.
4、策略モードの実現
-ポリシー・モードの目的は、各アルゴリズムを共通のインタフェースを持つ独立したクラスにカプセル化し、互いに置き換えることができるようにするアルゴリズムのセットです.-ポリシー・モードにより、アルゴリズムはクライアントに影響を及ぼさずに変化することができる.ポリシー・モードを使用すると、動作と環境を分割できます.–環境クラスは動作クラスの維持とクエリーを担当し、さまざまなアルゴリズムは特定のポリシーで提供されます.アルゴリズムと環境が独立しているため、アルゴリズムの変更は環境とクライアントに影響しません.
5、策略モードの作成手順:
-1)ポリシーオブジェクトに共通のインタフェースを定義します.
-2)上記の共通インタフェースを実現するポリシークラスを作成する
-3)ポリシーオブジェクトを使用するクラスにポリシーオブジェクトへの参照を保存します.
-4)ポリシーオブジェクトを使用するクラスで、ポリシーオブジェクトに対するsetメソッドとgetメソッド(注入)を実装するか、構築メソッドを使用して付与を完了する.
6、具体的な実装:計算のポリシーモード実装を行い、まず共通のインタフェースを定義し、計算の方法を定義し、それからこのインタフェースを実現するポリシークラス(計算の方法はそれぞれプラス、マイナス、乗算)を作成し、最後に環境クラスを定義し、その中にポリシーオブジェクトの参照を持ち、最後にクライアントが呼び出す.
-1)ポリシー共通インタフェースの定義
[java] view plain copy print ?
public interface Strategy 

  •     public int calculate(int a,int b); 
  • public interface Strategy
    {
    	public int calculate(int a,int b);
    }
    

    -2)具体的な戦略クラス、ここに3つの具体的な戦略クラス、AddStrategy、SubStrategy、MultiplyStrategyがあり、それぞれ加減算の計算戦略を実現している.
    [java] view plain copy print ?
    public class AddStrategy implements Strategy 

  •     public int calculate(int a, int b) 
  •     {        

  •         return a + b; 
  •     } 

  •  

  •  
  • public class SubStrategy implements Strategy 

  •     public int calculate(int a, int b) 

  •     { 
  •         return a - b; 

  •     } 

  •  
  • public class MultiplyStrategy implements Strategy 

  •     public int calculate(int a, int b) 

  •     { 
  •         return a * b; 

  •     } 
  • public class AddStrategy implements Strategy
    {
    	public int calculate(int a, int b)
    	{		
    		return a + b;
    	}
    
    }
    
    public class SubStrategy implements Strategy
    {
    	public int calculate(int a, int b)
    	{
    		return a - b;
    	}
    }
    
    public class MultiplyStrategy implements Strategy
    {
    	public int calculate(int a, int b)
    	{
    		return a * b;
    	}
    }

    -3)環境クラスの定義
    [java] view plain copy print ?
    public class Enveronment 

  •     private Strategy strategy; 
  •      

  •     public Enveronment(Strategy strategy) 
  •     { 

  •         this.strategy = strategy; 
  •     } 

  •  
  •     public Strategy getStrategy() 

  •     { 
  •         return strategy; 

  •     } 
  •  

  •     public void setStrategy(Strategy strategy) 
  •     { 

  •         this.strategy = strategy; 
  •     } 

  •      
  •     public int calculate(int a,int b) 

  •     { 
  •         return strategy.calculate(a, b); 

  •     } 
  • public class Enveronment
    {
    	private Strategy strategy;
    	
    	public Enveronment(Strategy strategy)
    	{
    		this.strategy = strategy;
    	}
    
    	public Strategy getStrategy()
    	{
    		return strategy;
    	}
    
    	public void setStrategy(Strategy strategy)
    	{
    		this.strategy = strategy;
    	}
    	
    	public int calculate(int a,int b)
    	{
    		return strategy.calculate(a, b);
    	}
    }

    -4)クライアントによる呼び出し
    [java] view plain copy print ?
    public class Client 

  •     public static void main(String[] args) 
  •     { 

  •         AddStrategy addStrategy = new AddStrategy(); 
  •          

  •         Enveronment enveronment = new Enveronment(addStrategy); 
  •          

  •         System.out.println(enveronment.calculate(3, 4)); 
  •          

  •         SubStrategy subStrategy = new SubStrategy(); 
  •          

  •         enveronment.setStrategy(subStrategy); 
  •          

  •         System.out.println(enveronment.calculate(3,4)); 
  •          

  •         MultiplyStrategy multiplyStrategy = new MultiplyStrategy(); 
  •          

  •         enveronment.setStrategy(multiplyStrategy); 
  •          

  •         System.out.println(enveronment.calculate(3, 4)); 
  •     } 

  • public class Client
    {
    	public static void main(String[] args)
    	{
    		AddStrategy addStrategy = new AddStrategy();
    		
    		Enveronment enveronment = new Enveronment(addStrategy);
    		
    		System.out.println(enveronment.calculate(3, 4));
    		
    		SubStrategy subStrategy = new SubStrategy();
    		
    		enveronment.setStrategy(subStrategy);
    		
    		System.out.println(enveronment.calculate(3,4));
    		
    		MultiplyStrategy multiplyStrategy = new MultiplyStrategy();
    		
    		enveronment.setStrategy(multiplyStrategy);
    		
    		System.out.println(enveronment.calculate(3, 4));
    	}
    }

    環境ロールクラスでは、クライアントが使用するポリシーを変更できるように、ポリシーに変数を適用するgetメソッドとsetメソッドが提供されます.
    7、ポリシーパターンの欠点–1)クライアントは、すべてのポリシークラスを知っていて、どのポリシークラスを使用するかを自分で決定する必要があります.–2)多くのポリシークラスを作成する.
    解決策は工場の方法を採用することだ.