策略模式

                      Strategy

                            定義了算法家族,分別分裝起來,讓他們之間可以相互轉換,次模式然算法的變化不會影響到使用算法客戶

               

策略模式:
1.策略模式動機:完成一項任務有多種不同的方式,每一種方式稱爲一種策略,我們可以根據環境或者條件的不同選擇不同的策略來完成該項任務。
在軟件開發中常常遇到這種情況:實現某一功能有多種途徑,此時可以使用一種設計模式來使系統可以靈活的選擇解決途徑,也能夠方便的增加新的
解決途徑。
2.策略模式是對象的行爲模式,用意是對一組算法的封裝。動態的選擇需要的算法並使用
 

3.策略模式角色:
 (1)抽象策略角色:通常用一個抽象類或者接口來實現,主要是定義這個算法所完成的功能
 (2)具體策略角色:包裝了相關算法和行爲
 (3)環境角色:持有策略類的引用



策略模式  DEMO:
//////////////////(1)抽象策略角色:通常用一個抽象類或者接口來實現,主要是定義這個算法所完成的功能
public abstract class Stratery {

public abstract void AlgorithmInterface();
}
////////////(2)具體策略角色:包裝了相關算法和行爲
public class ConcreteAlgorithmA extends Stratery{
@Override
public void AlgorithmInterface() {
System.out.println("ConcreteAlgorithm A");
}
}
public class ConcreteAlgorithmB extends Stratery{
@Override
public void AlgorithmInterface() {
System.out.println("ConcreteAlgorithm B");
}
}
public class ConcreteAlgorithmC extends Stratery{
@Override
public void AlgorithmInterface() {
System.out.println("ConcreteAlgorithm C");
}
}
//////////////(3)環境角色:持有策略類的引用
public class Context {
     Stratery  stratery;
public Context(Stratery stratery){
this.stratery=stratery;
}
public void ContextIntaface(){
stratery.AlgorithmInterface();
}
}
////////////////////////////////
public class Test {

public static void main(String []args){
Context context;
         context=new Context(new ConcreteAlgorithmA());
context.ContextIntaface();
context=new Context(new ConcreteAlgorithmB());
context.ContextIntaface();
context=new Context(new ConcreteAlgorithmC());
context.ContextIntaface();

}
}

///////////////////////////////////////////////////////

環境類:Context

4.策略模式比較簡單和並易於使用,策略模式是對算法的封裝,它把算法的職責和和算法本身分隔開,委派不同的對象管理。
策略模式通常將一系列算法封裝到一系列的策略類裏面,作爲一個抽象策略類的子類,換一句話說:“準備一組算法,並將每一個算法封裝起來,使得他們可以互換”。
5.優缺點
優點:
(1)動態改變算法或行爲
(2)簡化了單元測試,因爲每個算法都有自己的類,可以通過自己的接口單獨測試
缺點:客戶端必須知道所有的策略類,並自行決定使用哪一個策略類,必須對每一個算法瞭解

6.策略模式與簡單工廠模式的結合
在Context環境角色類中結合簡單工廠模式,即在Context中設計構造函數,傳入自變量,環境角色根據傳入的自變量選擇使用的算法,

DEMO:

設置一個定數類

public class number {
   final static int Alg_A=1;
   final static int Alg_B=2;
   final static int Alg_C=3;
}

CONTEXT中的代碼變爲如下形式

public class Context {
       
Stratery  stratery; 
public Context(int algA){

if(number.Alg_A==algA){
         stratery=new ConcreteAlgorithmA();
}else if(number.Alg_B==algA){
stratery=new ConcreteAlgorithmB();
}else if(number.Alg_C==algA){
stratery=new ConcreteAlgorithmC();
}

}

public void ContextIntaface(){
stratery.AlgorithmInterface();
}
}

//////////////////////////////////

public class Test {

public static void main(String []args){
Context context;
        

    context=new Context(number.Alg_A);
    context.ContextIntaface();


}
}


功能相同 ,算法的實現是不同,不同的時間應對不同的業務

發佈了42 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章