介紹:
在軟件開發(fā)中也常常遇到類似的情況,實現(xiàn)某一個功能有多種算法或者策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找、排序等。
一種常用的方法將多種算法寫到一個類中,該類提供多個方法,每一個方法對應(yīng)一個具體的查找算法;當然也可以將這些查找算法封裝在一個統(tǒng)一的方法中,通過if…else…或者switch-case等條件判斷語句來進行選擇。這兩種實現(xiàn)方法我們都可以稱之為硬編碼。然而,當很多個算法集中在一個類中時,這個類就會變得臃腫,這個類的維護成本變高也更易發(fā)生錯誤。如果需要種一種新的排序算法,需要修改封裝算法類的源代碼。這就明顯違反了OCP原則和單一職責原則。
如果將這些算法或者策略抽象出來 ,提供一個統(tǒng)一的接口,不同的算法或者策略有不同的實現(xiàn)類,這樣在程序客戶端就可以通過注入不同的實現(xiàn)對象來實現(xiàn)算法或者策略的動態(tài)替換,這種式的可擴展性、可維護性也就更高,這就是策略模式。
定義:
策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。
使用場景:
1.針對同一類型的多種處理方式,僅僅是具體行為有差別時。
2.需要安全地封裝多種同一類型的操作時。
3.出現(xiàn)同一抽象類有多個子類,而又需要使用if-else或者switch-case來選擇具體子類時。
具體實現(xiàn):
不同的交通工具計費規(guī)則不同,以公交地鐵為例
public class StrategyModel {
CalculateStrategy calculateStrategy;
public void main(String[] args) {
StrategyModel strategyModel = new StrategyModel();
strategyModel.setStrategy(new BusStrategy());
System.out.println("花費 " + strategyModel.calculatePrice(10) + " 元");
}
public void setStrategy(CalculateStrategy calculateStrategy) {
this.calculateStrategy = calculateStrategy;
}
public int calculatePrice(int km) {
return this.calculateStrategy.calculatePrice(km);
}
public interface CalculateStrategy {
/**
* 按距離計算價格
*
* @param km
* @return
*/
int calculatePrice(int km);
}
public class BusStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
return km * 5;
}
}
class SubwayStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
return km * 10;
}
}
}
策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實現(xiàn)策略。這個模式很好地演示了開閉原則,也就是定義抽象,注入不同的實現(xiàn),從而達到很好的擴展性。
優(yōu)點:
結(jié)構(gòu)清晰明了,使用簡單直觀;
耦合充相應(yīng)而言較低,擴展方便;
操作封裝也更為徹底,數(shù)據(jù)更為安全。
缺點:
隨著策略的增加,子類也會變的繁多。
參考 :
《Android源碼設(shè)計模式解析與實戰(zhàn)》