定義:定義一組算法,將每一個算法封裝起來,而且使它們之間能夠互相轉換算法
Context封裝角色:ide
也叫作上下文角色,起承上啓下封裝做用函數
Strategy抽象策略角色:this
策略、算法的抽象,一般爲接口,定義每一個策略或算法必須具備的方法和屬性spa
ConcreteStrategy具體策略角色:代理
實現抽象策略中的操做,該類含有具體的算法code
1.抽象的策略角色Strategy對象
抽象出具體策略角色子類中共有的方法blog
1 public interface Strategy { 2 //策略模式的運算法則 3 public void doSomething(); 4 }
2.具體策略角色ConcreteStrategy1接口
封裝的具體策略方法一
1 public class ConcreteStrategy1 implements Strategy { 2 @Override 3 public void doSomething() { 4 System.out.println("策略模式法則1"); 5 } 6 }
3.具體策略角色ConcreteStrategy2
封裝的具體策略方法二
1 public class ConcreteStrategy2 implements Strategy{ 2 @Override 3 public void doSomething() { 4 System.out.println("策略模式法則2"); 5 } 6 }
4.封裝角色
借用代理模式的思路
策略模式和代理模式的差距就是:策略模式的封裝角色和被封裝的策略類不是實現同一接口,而代理模式實現的是同一接口
1 public class Context { 2 //抽象策略 3 private Strategy strategy; 4 //構造函數設置具體策略 5 public Context(Strategy strategy){ 6 this.strategy = strategy; 7 } 8 //封裝後的策略方法 9 public void doAnything(){ 10 strategy.doSomething(); 11 } 12 }
5.主函數
要想實現哪個策略,首先利用多態new出對象
其次new出封裝角色對象
最後使用new出的封裝角色對象調用封裝後的策略方法
1 public class Client { 2 public static void main(String[] args) { 3 //聲明一個具體策略 4 Strategy strategy = new ConcreteStrategy1(); 5 //聲明上下文對象 6 Context context = new Context(strategy); 7 //執行封裝後的方法 8 context.doAnything(); 9 } 10 }
1.算法之間能夠自由切換。只要實現抽象策略,它就成爲抽象家族的一個成員,經過封裝角色對其進行封裝,保證對外提供「可自由切換」的策略
2.避免使用多重條件判斷。若沒有策略模式,系統沒法經過其餘方式知道什麼時候使用哪一種策略,只能經過if條件進行判斷,大量代碼冗餘
3.擴展性良好。系統中增長新的策略時,只要實現接口就能夠了
1.策略模式類數量多。每個策略都是一個類,複用性小,類數量增多
2.全部策略模式都須要對外暴露。上層模塊必須知道有哪些策略,而後才能決定使用哪個策略,這與迪米特法則相違背,我只是使用了一個策略,我憑什麼就要了解這個策略呢?那封裝還有什麼意義呢?這個缺點咱們能夠經過工廠方法模式、代理模式或享元模式修正
1.多個類只有在算法或行爲上稍有不一樣的場景
2.算法須要自由切換的場景
若是一個系統中的一個策略家族的具體策略數量超過4個,則須要老驢使用混合模式解決策略類膨脹和對外暴露的問題,不然後期維護會很麻煩