- 策略模式定義了一系列的算法觅丰,并將一系列算法封裝起來,使他們能相互替換。策略模式讓算法獨立于使用者而獨立變化式廷。
(1)策略設(shè)計模式實現(xiàn)
- 聲明一個接口,聲明一個計算方法
public interface CalculateStrategy {
int calculatePrice(int km);
}
- 實現(xiàn)三個具體的計算方法
public class BusCalculate implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
int busP = 2;
if (km>5)
busP = busP+km-5;
return busP;
}
}
public class SubwayCalculate implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
int subwayP=0;
if (km<5)
subwayP = 3;
if (km>5&&km<=10)
subwayP=4;
if (km>10)
subwayP=5;
return subwayP;
}
}
public class TaxiCalculate implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
return 2 * km;
}
}
- 創(chuàng)建一個計算類
public class PriceCalculate {
private CalculateStrategy calculateStrategy;
public void setCalculateStrategy(CalculateStrategy calculateStrategy){
this.calculateStrategy = calculateStrategy;
}
public int getPrice(int km){
return calculateStrategy.calculatePrice(km);
}
}
- 代碼調(diào)用實現(xiàn)
PriceCalculate priceCalculate = new PriceCalculate();
priceCalculate.setCalculateStrategy(new SubwayCalculate());
int price = priceCalculate.getPrice(10);
System.out.println(price);
優(yōu)點
- 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句芭挽,封裝更徹底滑废,數(shù)據(jù)更安全。
- 策略模式提供了管理相關(guān)的算法族的辦法袜爪。策略類的等級結(jié)構(gòu)定義了一個算法或行為族蠕趁。恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免重復(fù)的代碼辛馆。
- 耦合度低俺陋,都是基于接口調(diào)用和實現(xiàn),便于拓展和修改昙篙。
缺點
- 策略模式造成很多的策略類腊状。有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計成可共享的苔可,這樣策略類實例可以被不同客戶端使用缴挖。
- 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類硕蛹。這就意味著客戶端必須理解這些算法的區(qū)別醇疼,以便適時選擇恰當(dāng)?shù)乃惴?/li>