<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] >[success] # 什么是策略模式(菜鳥教程中策略模式總結) ~~~ 1.定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。 2.策略模式由兩部分構成:一部分是封裝不同策略的策略組,另一部分是 Context。 通過組合和委托來讓 Context 擁有執行策略的能力,從而實現可復用、可擴展和可維護, 并且避免大量復制粘貼的工作。 3.主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。 何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。 如何解決:將這些算法封裝成一個一個的類,任意地替換。 關鍵代碼:實現同一個接口。(靜態有類型檢查為了可以任意替換因此需要接口,但js和他們不一樣,如果ts另當別論) ~~~ >[danger] ##### 使用場景 ~~~ 1、如果在一個系統里面有許多類,它們之間的區別僅在于它們的'行為',那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。 2、一個系統需要動態地在幾種算法中選擇一種。 3、如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。 ~~~ >[danger] ##### 優缺點 * 優點 ~~~ 1、算法可以自由切換。 2、避免使用多重條件判斷。 3、擴展性良好。 ~~~ * 缺點 ~~~ 1、策略類會增多。 2、所有策略類都需要對外暴露。 ~~~ >[danger] ##### 注意點 ~~~ 1.如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題 ~~~ >[success] # 前端的策略模式 ~~~ 1.剛才的策略模式大部分針對后臺來說的,但是如果想實現策略模式你需要,其實就是兩部分 就上面說的第一個部分'封裝不同策略的策略組'可以理解成多個if判斷中的內容,'Context'執行 這些策略的調用 ~~~ >[danger] ##### 舉個例子 ~~~ 1.公司要發獎金,根據不同等級獎金比例也是不同,為了判斷每一個人應該根據等級和等級所對應的 倍數得到的獎金,寫出下面的代碼 2.下面的代碼確定是什么大量的if判斷不好維護,如果等級對應的倍數有所更改我們需要去改'calculateBonus ' ,對應代碼中的分支邏輯,最可怕的是'算法復用性',如果其他地方需要用到這些計算公式某些條數,你能做的 只有復制粘貼 ~~~ ~~~ var calculateBonus = function (performanceLevel, salary) { if(performanceLevel === 's'){ return salary * 4 } if(performanceLevel === 'a'){ return salary * 4 } if(performanceLevel === 'b'){ return salary * 4 } } calculateBonus('s',2000) calculateBonus('a',600) ~~~ >[danger] ##### 根據策略模式的兩個部分思路進行第一次重構代碼 ~~~ 1.將下面的代碼分成了兩個部分,第一個部分就是'組合函數'就是這些條件的對應算法, 第二部分也就是執行部分'calculateBonus ' 2.但是這代碼也有個問題就是會導致'calculateBonus ' 里面的條件語句越來越多 ~~~ ~~~ var performanceS = function( salary ){ return salary * 4; }; var performanceA = function( salary ){ return salary * 3; }; var performanceB = function( salary ){ return salary * 2; }; var calculateBonus = function( performanceLevel, salary ){ if ( performanceLevel === 'S' ){ return performanceS( salary ); } if ( performanceLevel === 'A' ){ return performanceA( salary ); } if ( performanceLevel === 'B' ){ return performanceB( salary ); } }; calculateBonus( 'A' , 10000 ); // 輸出:30000 ~~~ >[danger] ##### es5 -- 嘗試用類的思想去實現一個符合后臺的策略模式 ~~~ 1.下面的代碼就將需要計算的部分封裝成了類,Bonus 作為了Context 擁有了執行 策略的能力也就是執行這些算法類 2.定義一系列的算法,把它們各自封裝成策略類,算法被封裝在策略類內部的方法里。 在客戶對 Context發起請求的時候,Context總是把請求委托給這些策略對象中間的某一個進行計算。 ~~~ ~~~ // 算法 var performanceS = function(){}; performanceS.prototype.calculate = function( salary ){ return salary * 4; }; var performanceA = function(){}; performanceA.prototype.calculate = function( salary ){ return salary * 3; }; var performanceB = function(){}; performanceB.prototype.calculate = function( salary ){ return salary * 2; }; //接下來定義獎金類Bonus: var Bonus = function(){ this.salary = null; // 原始工資 this.strategy = null; // 績效等級對應的策略對象 }; Bonus.prototype.setSalary = function( salary ){ this.salary = salary; // 設置員工的原始工資 }; Bonus.prototype.setStrategy = function( strategy ){ this.strategy = strategy; // 設置員工績效等級對應的策略對象 }; Bonus.prototype.getBonus = function(){ // 取得獎金數額 return this.strategy.calculate( this.salary ); // 把計算獎金的操作委托給對應的策略對象 }; var bonus = new Bonus(); bonus.setSalary( 10000 ); bonus.setStrategy( new performanceS() ); // 設置策略對象 console.log( bonus.getBonus() ); // 輸出:40000 bonus.setStrategy( new performanceA() ); // 設置策略對象 console.log( bonus.getBonus() ); // 輸出:30000 ~~~ >[danger] ##### js 天然特性的策略模式 ~~~ var strategies = { "S": function( salary ){ return salary * 4; }, "A": function( salary ){ return salary * 3; }, "B": function( salary ){ return salary * 2; } }; var calculateBonus = function( level, salary ){ return strategies[ level ]( salary ); }; console.log( calculateBonus( 'S', 20000 ) ); // 輸出:80000 console.log( calculateBonus( 'A', 10000 ) ); // 輸出:30000 ~~~ >[success] # js 的策略模式 總結 ~~~ 1.引用書中引用的話'Peter Norvig在他的演講中曾說過:“在函數作為一等對 象的語言中,策略模式是隱形的。' 2.相比java的策略模式需要建立接口建立類來維護,js天然優勢就是函數是 一等公民,我們可以不用像java那么復雜來實現策略 3.書中對js的策略模式的優點總結: 3.1 策略模式利用組合、委托和多態等技術和思想,可以有效地避免多重 條件選擇語句。 3.2策略模式提供了對開放—封閉原則的完美支持,將算法封裝在獨立的 strategy中,使得它們易于切換,易于理解,易于擴展。 3.3策略模式中的算法也可以復用在系統的其他地方,從而避免許多重復 的復制粘貼工作。 3.4在策略模式中利用組合和委托來讓Context擁有執行算法的能力,這 也是繼承的一種更輕便的替代方案。 4.書中對js策略模式的缺點總結: 4.1首先,使用策略模式會在程序中增加許多策略類或者策略對象,但實 際上這比把它們負責的邏輯堆砌在Context中要好(js相比java來說這個缺點就沒有那么明顯,java需要大量的類來維持策略) 4.2其次,要使用策略模式,必須了解所有的strategy,必須了解各個 strategy之間的不同點,這樣才能選擇一個合適的strategy。比如,我們要選 擇一種合適的旅游出行路線,必須先了解選擇飛機、火車、自行車等方案的 細節。此時strategy要向客戶暴露它的所有實現,這是違反最少知識原則的 ~~~ * 代碼中我們其實經常會用到策略模式,我們把代碼在簡化一下來看熟知的策略模式 ~~~ var S = function( salary ){ return salary * 4; }; var A = function( salary ){ return salary * 3; }; var B = function( salary ){ return salary * 2; }; var calculateBonus = function( func, salary ){ return func( salary ); }; calculateBonus( S, 10000 ); // 輸出:40000 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看