[設計模式] javascript 之 策略模式
定義: 封裝一系列的演算法,使得他們之間可以相互替換,本模式使用演算法獨立於使用它的客戶的變化。 說明:策略模式,是一種組織演算法的模式,核心不在於演算法,而在於組織一系列的演算法,並且如何去使用它;策略模式作用在於,行為實現的不可預見,面對這樣的一種變化,我們得思考如何使用程式好維跟擴充,並使得客戶很好的使用演算法的方式; 策略模式 使用要注意它 "變化" 的一面,策略模式就是來解決這個 變化 問題的。 比如商場買賣的價格或促銷問題,如果不使用模式,就可能只是 把“所有”的情況用 if else 類似“寫入程式碼” 的開式寫在一起,或是傳個傳個參數,稍加點內部邏輯代碼,最好就是一同寫在一個類裡面; P如: function Price(personType, price) { //大客戶 5 折 if (personType == 'vip') { return price * 0.5; } else if (personType == 'old'){ //老客戶 3 折 return price * 0.3; } else { return price; //其他都全價 }} 我們把上面的看成一個類,如果要擴充一種價格手段,就得在 Price 裡添加新的 else if,或是修改某個演算法邏輯,就得某個 if 或 else if 裡修改, 這是對單個類的修改,而且這種情況勢必得經常修改這個類,這違反了設計模式的一個原則:對修改關閉,對擴充開放的原則; 而且這些演算法,在不同客戶面前可能會經常替換,固定參數也不能滿足需求; 解決這種問題就可以使用原則模式,策略在於關注變化,把各行為不同的實現各自封裝起來,比如要實現一隻動物,走路,叫聲,吃東西的各種表現,就可以把走路,叫聲,吃東西,就可以定義三個介面抽象,然後把他們各自具體實現去實現三個介面; 前面說,策略模式是使演算法可獨立於使用的客戶的改變,所以策略模式裡,一般是在用戶端定義選擇使用的演算法,傳入相應的參數,再根據演算法返回結果; 這種有點類似簡單原廠模式,這種再加層 Context 是為了客戶使用起來更簡單調用,不必自處理一些邏輯,讓團隊開發,更趨一致;Context 也可以做成一個基類,其下可以有多個實現子類繼承; Context 跟 Client 可以改為: 繼承子類只需引用自己的實現介面演算法,即可,這樣客戶可以更簡單的調用,也不必理會各種動物使用什麼介面,是怎麼實現的了; 執行個體源碼 這裡以上面的商場價格手段來實現: 1. 實現幾種演算法,Javascript是弱類型,沒有介面這號東西,就是直接寫了; vip 客戶 function vipPrice() { this.discount = 0.5;} vipPrice.prototype.getPrice = function(price) { return price * this.discount;} 老客戶: function oldPrice() { this.discount = 0.3;} oldPrice.prototype.getPrice = function(price) { return price * this.discount;} 普通客戶 function Price() { this.discount = 1;} Price.prototype.getPrice = function(price) { return price ;} 2. 上下文: function Context() { this.name = ''; this.strategy = null; this.price = 0;} Context.prototype.set = function(name, strategy, price) { this.name = name; this.strategy = strategy; this.price = price;} Context.prototype.getResult = function() { console.log(this.name + ' 的結賬價為: ' + this.stragegy.getPrice(this.price));} 3. 用戶端使用; // 上下文var context = new Context(); //vip客戶var vip = new vipPrice();context.set ('vip客戶', vip, 200);context.getPrice(); //老客戶var old = new oldPrice();context.set ('老客戶', old, 200);context.getPrice(); //普通客戶//... 這樣即使得 客戶 與演算法解藕,又使得修改跟擴充能獨立的進行,不影到用戶端或其他演算法的使用; 其他說明 策略模式是一個非常實用跟常用的設計模式,普通用於商場價格,促銷等情境,他跟原廠模式很像,可以說是他的一種升級版本; 策略模式相關模式:原廠模式,組合模式;