1.什麼是策略模式
策略模式屬於對象行為模式,其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使它們可以相互替換。
2.策略模式的結構
策略模式是對算法的包裝,把使用算法的責任和算法本身分開,委派給不同的對象管理。
環境(Context)角色:持有一個Strategy引用;
抽象角色(Strategy)對象:抽象角色,由一個抽象類或借口實現,它指出所有的具體策略類所需的接口;
具體角色(ConcreteStrategy)對象:包裝了相關算法或行為;
[cpp]
public class Context{
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public ContextInterface(){
this.strategy.strategyInterface();
}
}
public interface Strategy(){
void strategyInterface();
}
public class ConcreteStrategyA implements Strategy{
void strategyInterface(){
System.out.println("this is strategyInterfaceA");
}
}
public class Context{
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public ContextInterface(){
this.strategy.strategyInterface();
}
}
public interface Strategy(){
void strategyInterface();
}
public class ConcreteStrategyA implements Strategy{
void strategyInterface(){
System.out.println("this is strategyInterfaceA");
}
}
策略模式僅僅封裝算法,提供新的算法插入到已有系統以及老算法從系統中刪除的方法,但策略模式不決定何時使用何種算法,在什麼情況下使用何種算法是由客戶端決定的。
策略模式的重心不是算法如何實現,而是如何組織調用這些算法,從而讓程序結構更靈活,具有更好的擴展性和維護性。策略模式使得各種算法在地位上是平等的,因此各個算法之間可以相互替換,策略算法是相同行為的不同實現。運行時,策略模式在一個時刻只能使用一個具體的策略實現對象。
3.策略模式和工廠模式的區別
工廠模式是創建型模式 ,它關注對象創建,提供創建對象的接口. 讓對象的創建與具體的使用客戶無關。策略模式是對象行為型模式 ,它關注行為和算法的封裝 。它定義一系列的算法,把每一個算法封裝起來, 並且使它們可相互替換。使得算法可獨立於使用它的客戶而變化。
我們去旅行。策略模式的做法:有幾種方案供你選擇旅行,選擇火車好呢還是騎自行車,完全有客戶自行決定去構建旅行方案(比如你自己需要去買火車票,或者機票)。而工廠模式是你決定哪種旅行方案後,不用關注這旅行方案怎麼給你創建,也就是說你告訴我方案的名稱就可以了,然後由工廠代替你去構建具體方案(工廠代替你去買火車票)。
4.策略模式的優缺點
優點:
(1)策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類裡面,從而避免代碼重復。
(2)使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重條件語句裡面,比使用繼承的辦法還要原始和落後。
缺點:
(1)客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道算法或行為的情況。
(2)由於策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那麼對象的數目就會很可觀。