策略模式
定義
–定義一組算法,將每個使它們之間可以互換。
–策略模式使這些算法在能夠互不影響地變化
組成
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行爲。
實現
–策略模式使得算法可以在不影響到客戶端的情況下發生變化。使用策略模式可以把行爲和環境分割開來。
–環境類負責維持和查詢行爲類,各種算法則在具體策略中提供。由於算法和環境獨立開來,算法的修改都不會影響環境和客戶端
步驟
1)對策略對象定義一個公共接口。2)編寫策略類,該類實現了上面的公共接口
3)在使用策略對象的類中保存一個對策略對象的引用。
4)在使用策略對象的類中,實現對策略對象的set和get方法(注入)或者使用構造方法完成賦值
實例
public interface IActive {
public void doActive();
}
具體策略角色
public class Jump implements IActive {
@Override
public void doActive() {
System.out.println(" ==jump== ");
}
}
public class Run implements IActive {
@Override
public void doActive() {
System.out.println(" ==run== ");
}
}
環境角色
public class People {
private IActive active;
public People(IActive active){
this.active = active;
}
public void doActive(){
this.active.doActive();
}
public IActive getActive() {
return active;
}
public void setActive(IActive active) {
this.active = active;
}
}
public class Client {
public static void main(String[] args) {
//具體角色
IActive active = new Run();
//創建環境
People people = new People(active);
people.doActive();//run
people.setActive(new Jump());
people.doActive();//jump
}
}
策略模式的優缺點
1)策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承可以把公共的代碼移到父類裏面,從而避免代碼重複。
2)使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護,它把採取哪一種算法或採取哪一種行爲的邏輯與算法或行爲的邏輯混合在一起,統統列在一個多重條件語句裏面,比使用繼承的辦法還要原始和落後。
策略模式的缺點
1)客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道算法或行爲的情況。
2)由於策略模式把每個具體的策略實現都單獨封裝成爲類,如果備選的策略很多的話,那麼對象的數目就會很可觀。