介紹:
在軟件開發(fā)中也常常遇到類似的情況春瞬,實(shí)現(xiàn)某一個(gè)功能有多種算法或者策略柴信,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找宽气、排序等随常。
一種常用的方法將多種算法寫到一個(gè)類中,該類提供多個(gè)方法萄涯,每一個(gè)方法對應(yīng)一個(gè)具體的查找算法绪氛;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中,通過if…else…或者switch-case等條件判斷語句來進(jìn)行選擇涝影。這兩種實(shí)現(xiàn)方法我們都可以稱之為硬編碼枣察。然而,當(dāng)很多個(gè)算法集中在一個(gè)類中時(shí),這個(gè)類就會(huì)變得臃腫序目,這個(gè)類的維護(hù)成本變高也更易發(fā)生錯(cuò)誤臂痕。如果需要種一種新的排序算法,需要修改封裝算法類的源代碼猿涨。這就明顯違反了OCP原則和單一職責(zé)原則握童。
如果將這些算法或者策略抽象出來 ,提供一個(gè)統(tǒng)一的接口叛赚,不同的算法或者策略有不同的實(shí)現(xiàn)類澡绩,這樣在程序客戶端就可以通過注入不同的實(shí)現(xiàn)對象來實(shí)現(xiàn)算法或者策略的動(dòng)態(tài)替換,這種式的可擴(kuò)展性俺附、可維護(hù)性也就更高肥卡,這就是策略模式。
定義:
策略模式定義了一系列的算法昙读,并將每一個(gè)算法封裝起來召调,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化蛮浑。
使用場景:
1.針對同一類型的多種處理方式,僅僅是具體行為有差別時(shí)只嚣。
2.需要安全地封裝多種同一類型的操作時(shí)沮稚。
3.出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用if-else或者switch-case來選擇具體子類時(shí)册舞。
具體實(shí)現(xiàn):
不同的交通工具計(jì)費(fèi)規(guī)則不同蕴掏,以公交地鐵為例
public class StrategyModel {
CalculateStrategy calculateStrategy;
public void main(String[] args) {
StrategyModel strategyModel = new StrategyModel();
strategyModel.setStrategy(new BusStrategy());
System.out.println("花費(fèi) " + strategyModel.calculatePrice(10) + " 元");
}
public void setStrategy(CalculateStrategy calculateStrategy) {
this.calculateStrategy = calculateStrategy;
}
public int calculatePrice(int km) {
return this.calculateStrategy.calculatePrice(km);
}
public interface CalculateStrategy {
/**
* 按距離計(jì)算價(jià)格
*
* @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;
}
}
}
策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實(shí)現(xiàn)策略调鲸。這個(gè)模式很好地演示了開閉原則盛杰,也就是定義抽象,注入不同的實(shí)現(xiàn)藐石,從而達(dá)到很好的擴(kuò)展性即供。
優(yōu)點(diǎn):
結(jié)構(gòu)清晰明了,使用簡單直觀于微;
耦合充相應(yīng)而言較低逗嫡,擴(kuò)展方便;
操作封裝也更為徹底株依,數(shù)據(jù)更為安全驱证。
缺點(diǎn):
隨著策略的增加,子類也會(huì)變的繁多恋腕。
參考 :
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》