1. 程式人生 > 實用技巧 >策略模式的個人理解

策略模式的個人理解

1.什麼是策略模式

  策略模式(Strategy Pattern)又稱政策模式,其定義一系列的演算法,把它們一個個封裝起來,並且使它們可以互相替換。

  封裝的策略演算法一般是獨立的,策略模式根據輸入來調整採用哪個演算法。關鍵是策略的實現和使用分離

2.如何理解策略模式

 可以設想一下 , 一個萬能遙控器 , 可以調節紅外頻率和波長 , 來適配對應的電器 

  1. 遙控器的紅外頻率和波長 與 電器 之間相互獨立,但又可以相互替換;
  2. 遙控器的紅外頻率和波長 與電器(封裝上下文)之間可以根據需要的不同選用不同的策略;

3.如何運用策略模式

小demo:

//策略模式demo
const celue = (function
(){ //使用閉包隱藏演算法 //演算法部分提取出來儲存為一個物件 var obj = { funA(n) { return n + 'a' }, funB(n) { return n + 'b' }, funC(n) { return n + 'c' } } //入口 return { diao:function(fun,n){ //執行 return obj[fun] && obj[fun](n); }, addfun(fun,fn){
// 預留了增加策略的入口,便於擴充套件 if (obj[fun]) return; obj[fun] = fn } } })() celue.diao('funB',132) //通過物件的鍵值索引呼叫具體的演算法 console.log(celue.diao('funB',132)) //b132 celue.addfun('funD',function(n){ //註冊新計算方式 return n+'d' }) console.log(celue.diao('funD',123456)) //d123456

4.策略模式的優缺點

優點:

  1. 策略之間相互獨立,但策略可以自由切換,這個策略模式的特點給策略模式帶來很多靈活性,也提高了策略的複用率;
  2. 可擴充套件性好,策略可以很方便的進行擴充套件;
  3. 如果不採用策略模式,那麼在選策略時一般會採用多重的條件判斷,採用策略模式可以避免多重條件判斷,增加可維護性;

缺點: 

  1. 策略相互獨立,因此一些複雜的演算法邏輯無法共享,造成一些資源浪費;
  2. 如果使用者想採用什麼策略,必須瞭解策略的實現,因此所有策略都需向外暴露,這是違背迪米特法則/最少知識原則的,也增加了使用者對策略物件的使用成本。

4.策略模式的使用場景

  1. 需要自由切換演算法
  2. if 判斷較多 , 需要規避多重判斷