策略模式

一.什麼是策略模式

  定義:定義一組算法,將每一個算法封裝起來,而且使它們之間能夠互相轉換算法

二.類圖

  

  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個,則須要老驢使用混合模式解決策略類膨脹和對外暴露的問題,不然後期維護會很麻煩

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息