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();
}
}
功能相同 ,算法的實現是不同,不同的時間應對不同的業務