定義
策略模式是一種比較簡單的模式:定義一組算法,將每個算法封裝起來,並且使他們之間可以互換。
策略模式的通用類圖:
策略模式使用的是面向對象的繼承和多態機制,非常容易理解和掌握,
也叫上下文角色,起承上啓下封裝作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。
策略、算法的抽象,通常爲接口,定義每個策略或算法必須具有的方法和屬性。
通用代碼實現
抽象的策略角色
public interface Strategy {
//策略模式的運算法則
public void doSomething();
}
具體策略角色
public class ConcreteStrategy implements Strategy {
public void doSomething() {
System.out.println("");
}
}
封裝角色
策略模式的重點是封裝角色,它是借用了代理模式的思路,差別就是策略模式的封裝角色和被封裝的策略不用是同一個接口,如果是同一個接口那就成爲代理模式了。
public class Context {
//抽象策略
private Strategy strategy = NULL;
//構造函數設置具體策略
public Context(Strategy strategy) {
this.strategy = strategy;
}
//封裝後的策略方法
public void doAnything(){
this.strategy.doSomething();
}
}
高層模塊調用非常簡單,知道用哪個策略,產生它的對象,然後放到封裝角色中就完成任務了。
策略模式的應用
優點
只要實現抽象策略,它就成爲策略家族中的一個成員,通過封裝角色對其進行封裝,保證對外提供可自由切換的策略。
如果沒有策略模式,一會要使用A策略一會要使用B策略,怎麼設計?使用多重的條件語句?多重條件語句不易維護,而且出錯的概率大大增加。使用策略模式後,可以由其他模塊決定使用何種策略
缺點
- 策略類數量增多:每一個策略一個類,複用的可能性很小
- 所有的策略類都需要對外暴露
使用場景
- 多個類只有在算法或行爲上稍有不同的場景
- 算法需要自由切換