1. 概念
定義一系列的算法滚局,把他們一個個封裝起來作郭,并且使他們可互相替換。本模式使得算法可獨立于使用它的客戶端而變化逛腿。
2. 使用場景
一個類定義了多種行為诱建,并且這些行為在這個類的方法中以多個條件語句的形式出現(xiàn)蝴蜓,那么可以使用策略模式避免在類中使用大量的條件語句。
3. 實例
interface AbstractStrategy {
int calculatePrice(int km);
}
public class BusStrategy implements AbstractStrategy{
@Override
public int calculatePrice(int km) {
int extraTotal = km - 10;
int extraFactor = extraTotal / 5;
int faction = extraFactor % 5;
int price = 1 + extraFactor % 5;
return faction > 0 ? ++price : price;
}
}
public class SubwayStrategy implements AbstractStrategy {
@Override
public int calculatePrice(int km) {
if (km <= 6) {
return 3;
} else if (km > 6 && km < 12) {
return 4;
} else if (km > 12 && km < 24) {
return 5;
} else if (km > 24 && km < 32) {
return 6;
}
return 7;
}
}
public class Context {
private AbstractStrategy strategy;
public void setStrategy(AbstractStrategy strategy) {
this.strategy = strategy;
}
public int caculatePrice(int km) {
return strategy.calculatePrice(km);
}
}
public class Client {
public static void main(String[] args) {
Context calculate = new Context();
calculate.setStrategy(new BusStrategy());
System.out.println("公交車20km價格:" + calculate.caculatePrice(20));
}
}
如果不用到策略模式俺猿,而是簡單地添加if判斷條件:
public class PriceCalculate {
private static final int BUS = 1;
private static final int SUBWAY = 2;
public static void main(String[] args) {
PriceCalculate priceCalculate = new PriceCalculate();
System.out.println("做20km公交票價:" + priceCalculate.calculatePrice(11, BUS));
}
/**
* 公交計價茎匠,10公里之內(nèi)1塊錢,超過10公里每5公里1塊錢
*
* @param km
* @return
*/
private int busPrice(int km) {
int extraTotal = km - 10;
int extraFactor = extraTotal / 5;
int faction = extraFactor % 5;
int price = 1 + extraFactor % 5;
return faction > 0 ? ++price : price;
}
/**
* 地鐵售價
* @param km
* @return
*/
private int subwayPrice(int km) {
if (km <= 6) {
return 3;
} else if (km > 6 && km < 12) {
return 4;
} else if (km > 12 && km < 24) {
return 5;
} else if (km > 24 && km < 32) {
return 6;
}
return 7;
}
public int calculatePrice(int km, int type){
if (type==BUS){
return busPrice(km);
} else if (type==SUBWAY){
return subwayPrice(km);
}
return 0;
}
}
這樣當添加新的策略時押袍,不好維護诵冒,而且耦合度比較高。
4. 特點
上下文context與具體策略是松耦合關(guān)系
策略模式滿足“開-閉原則”
5. 在android中的應用
Volley中對于HttpStack的設計