设计模式-策略模式(Strategy Pattern)
Define a family of algorithms,encapsulate each one,and make them interchangeable(定義一組算法,將每個算法都封裝起來,并且使它們之間可以互換)
策略模式通用類圖
- 現在舉一個簡單的策略模式
造車接口
?
public interface CarStrategy {public void createCar(); }奧迪車
public class AuDiCar implements CarStrategy {@Overridepublic void createCar() {System.out.println("造奧迪車");} }寶馬車
public class BMWCar implements CarStrategy {@Overridepublic void createCar() {System.out.println("造寶馬");} }奔馳車
public class BenzCar implements CarStrategy {@Overridepublic void createCar() {System.out.println("造奔馳");} }造車上下文Context
public class CarContext {private CarStrategy carStrategy;public CarContext(CarStrategy carStrategy) {this.carStrategy = carStrategy;}public void create() {carStrategy.createCar();} }造車工廠(who造車)
public class CarFactory {public static void main(String[] args) {CarContext carContext;carContext = new CarContext(new AuDiCar());carContext.create();System.out.println("=======================");carContext = new CarContext(new BenzCar());carContext.create();System.out.println("=======================");carContext = new CarContext(new BMWCar());carContext.create();} }以上就是一個簡單的策略例子
-
策略模式的優點
1.算法可以自由切換
這是策略模式本身定義的,只要實現抽象策略,它就成為策略家族的一個成員,通過封
裝角色對其進行封裝,保證對外提供“可自由切換”的策略。
2.避免使用多重條件判斷
如果沒有策略模式,我們想想看會是什么樣子?一個策略家族有5個策略算法,一會要
使用A策略,一會要使用B策略,怎么設計呢?使用多重的條件語句?多重條件語句不易維護,而且出錯的概率大大增強。使用策略模式后,可以由其他模塊決定采用何種策略,策略家族對外提供的訪問接口就是封裝類,簡化了操作,同時避免了條件語句判斷。
3.擴展性良好
這甚至都不用說是它的優點,因為它太明顯了。在現有的系統中增加一個策略太容易
了,只要實現接口就可以了,其他都不用修改,類似于一個可反復拆卸的插件,這大大地符合了OCP原則。
-
策略模式的缺點
1.策略類數量增多
每個策略都是一個類。復用的可能性很小,類數量增多
2.所有策略類都需要對外暴露
上層模塊都必須知道有哪些策略這與迪米特法則是相違背的,我只是想使用了一個策略,我憑什么就要了解這個策略呢?那要你的封裝類還有什么意義?這是原裝策略模式的一個缺點,幸運的是,我們可以使用其他模式來修正這個缺陷,如工廠方法模式、代理模式或享元模式。
-
策略模式的使用場景
1.多個類只有在算法或行為上稍有不同的場景
2.算法需要自由切換的場景
-
策略枚舉
需求是:輸入3個參數,進行加減法運算,參數中兩個是int型的,剩下的一個參數是String型的,只有“+”、“-”兩個符號可以選擇,不要考慮什么復雜的校驗,我們做的是白箱測試,輸入的就是標準的int類型和合規的String類型,各位大俠,想想看,怎么做,簡單得很!
public enum Calculator {ADD{@Overridepublic int exec(int a, int b) {return a+b;}},SUB{@Overridepublic int exec(int a, int b) {return a-b;}};public abstract int exec(int a, int b); } public class Client {public static void main(String[] args) {//輸入兩個參數是數字int a = 2;String symbol = "+"; //符號int b = 1;System.out.println("運行結果為:"+a+symbol+b+"="+Calculator.ADD.exec(a,b));} }以上就是策略模式的簡單用法,歡迎大家指教,萬分感謝?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的设计模式-策略模式(Strategy Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jdk ServiceLoader怎么用
- 下一篇: 设计模式-策略模式和工厂模式结合使用