標籤: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實現策略模式