JavaScript實現策略模式

來源:互聯網
上載者:User

標籤:script   代碼   學習   轉換   旅遊   分支   回顧   一個   模式   

  在開篇之前先分享今天看到的一句關於設計模式的話:將不變的部分和變化的部分隔開是每個設計模式的主題

  請大家自行感受這句話的精髓所在,並且思考學習設計模式究竟能給我們編程帶來什麼樣的東西,歡迎大家在文章下面評(chui)論(shui),分享自己的寶貴見解。好了,回到今天的正題,JavaScript實現策略模式。

 

什麼是策略模式

  定義一系列的演算法,把它們一個個封裝起來,並且使它們可以相互轉換。講人話就是:我想去旅遊,那麼我可以選擇不同的方法(策略)去達到我的目的——旅遊。比如說坐飛機,走路,甚至是小黃車ofo都行,這看你具體是怎麼選擇。如果你想快一點,那就選擇坐飛機,如果你有夢想,那就選擇走路,不管你選擇什麼,最後你都能達到相同的目的——旅遊。

 

策略模式思想

   接合上面的例子和開篇第一句話,在策略模式中,不變的是我們的目的——旅遊,而變化的部分是我們的去的方式(坐飛機,走路,ofo),所以我們就要把這兩部分隔開以實現解耦。也就是策略模式的目的所在。為了比較策略模式帶來的好處,我先用一般的方式完成我上面的例子。請看代碼:

 var travel = function(transportation, destination) {        if(transportation == ‘plane‘) {            console.log("乘坐飛機到" + destination + "啦");        }        if(transportation == ‘foot‘) {            console.log("走路到" + destination + "啦");        }        if(transportation == ‘ofo‘) {            console.log("騎小黃車到" + destination + "啦");        }    }        travel("foot", "北京"); //控制台列印:走路到北京啦    travel("ofo", "天堂");  //控制台列印:騎小黃車到天堂啦

 

  我們現在已經完成了旅遊的代碼,貌似不錯哦。但是恕我直言,這就是一段辣雞代碼。嘻嘻,具體有如下原因:

  1、travel函數包含了很多if語句,這些語句需要覆蓋所有的邏輯分支

  2、travel函數缺乏彈性,如果現在又多了一種交通工具小藍車,我們就必須修改travel函數原始碼,這不科學!屬實是違反了開放-封閉原則。

  現在我們使用原則模式來最佳化這段代碼,請看下面代碼:

   var strategies = {        plane: function (destination) {            console.log("乘坐飛機到" + destination + "啦");        },        foot: function (destination) {            console.log("走路到" + destination + "啦");        },        ofo: function (destination) {            console.log("騎小黃車到" + destination + "啦")        }    }    var travel = function (transportation, destination) {          strategies[transportation](destination);    }    travel("foot", "北京");    travel("ofo", "天堂");

 

執行結果如下:

 

  可以看到我們通過策略模式完成了我們的需求,並且如果以後多了交通工具,管它是小黃車小白車還是小黑車,我們只用在策略對象strategies添加新的配置就可以了,而不用改動我們的travel函數。

  再次回顧開篇第一句話:將不變的部分和變化的部分隔開是每個設計模式的主題

  結合我們的策略模式思考,策略模式不變的部分就是目的(上例旅遊),變化的部分就是過程(交通工具和目的地)。通過策略模式我們把這兩部分徹底解耦,我們的過程(strategies)變化了也不會影響到我們的目的(travel)。我認為這就是策略模式給我們帶來的好處。

  

    

JavaScript實現策略模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.