官方概念:策略模式將可變的部分從程序中抽象分離成算法接口,在該接口下分別封裝一系列算法實(shí)現(xiàn)耳高,并使他們可以相互替換扎瓶,從而導(dǎo)致客戶端程序獨(dú)立于算法的改變。
設(shè)計原則:將應(yīng)用中需要變化的部分獨(dú)立成一個接口泌枪,這個接口在總體上規(guī)定了行為框架概荷,通過多態(tài)和接口實(shí)現(xiàn)類,多用組合碌燕,少用繼承误证,賦予程序?qū)拸V的擴(kuò)展性。
demo如下:
步驟一:通過分離變化得出策略接口
// 策略接口StrategyInterface
public interface StrategyInterface {
void go();
}
步驟二:編寫策略接口實(shí)現(xiàn)類
// 策略接口實(shí)現(xiàn)類1
public class StrategyInterfaceImpl1 implements StrategyInterface{
@Override
public void go() {
System.out.println("go1");
}
}
// 策略接口實(shí)現(xiàn)類2
public class StrategyInterfaceImpl2 implements StrategyInterface {
@Override
public void go() {
System.out.println("go2");
}
}
步驟三:編寫實(shí)體父類
// 實(shí)體父類
public class PojoCar {
// 注入接口
private StrategyInterface strategyInterface;
// 無參構(gòu)造
public PojoCar() {
}
// 父類本身具有的方法
public void showName(){
System.out.println("這是輛車修壕!");
}
// 為接口提供setter方法
public void setStrategyInterface(StrategyInterface strategyInterface) {
this.strategyInterface = strategyInterface;
}
// 父類方法中調(diào)用策略接口中的方法
public void goMethod(){
strategyInterface.go();
}
}
步驟四:編寫實(shí)體子類
// 實(shí)體子類
public class PojoCar1 extends PojoCar {
// 子類重寫父類showName方法
public void showName(){
System.out.println("這是PojoCar1愈捅!");
}
// 子類調(diào)用父類無參構(gòu)造
public PojoCar1() {
super();
// 調(diào)用setter方法,將策略接口的實(shí)現(xiàn)類注入
// super.setStrategyInterface(new StrategyInterfaceImpl1());
super.setStrategyInterface(new StrategyInterfaceImpl2());
}
}
測試:
// 測試
public class Test {
public static void main(String[] args) {
PojoCar p = new PojoCar1();
p.goMethod();// 調(diào)用goMethod
p.showName();// 調(diào)用showName
}
}
測試結(jié)果:執(zhí)行策略接口實(shí)現(xiàn)類2中定義的方法輸出go2
go2
這是PojoCar1慈鸠!
策略模式的優(yōu)點(diǎn):
1. 用組合的方式蓝谨,使架構(gòu)更加靈活
2. 富有彈性,可以較好應(yīng)對變化
3. 相對繼承青团,有更好的代碼復(fù)用性
4. 相對于抽象方法譬巫,無需在每個類中都重寫父類方法
5. 消除大量條件語句
策略模式缺點(diǎn):
1. 需要了解更多業(yè)務(wù)細(xì)節(jié)
2. 增加了類的數(shù)量,不便維護(hù)
適用場景:
1. 許多相關(guān)的類僅僅是行為差異
2. 運(yùn)行時需要選擇不同的算法變體
3. 通過條件語句在多個分支中選取一個