今天看到一篇很好的文章和你們分享一下:算法
定義: 封裝一系列的算法,使得他們之間能夠相互替換,本模式使用算法獨立於使用它的客戶的變化。設計模式
說明:策略模式,是一種組織算法的模式,核心不在於算法,而在於組織一系列的算法,而且如何去使用它;策略模式做用在於,行爲實現的不可預見,面對這樣的一種變化,咱們得思考如何使用程序好維跟擴展,並使得客戶很好的使用算法的方式;this
策略模式 使用要注意它 "變化" 的一面,策略模式就是來解決這個 變化 問題的。編碼
好比商場買賣的價格或促銷問題,若是不使用模式,就可能只是 把「全部」的狀況用 if else 相似「硬編碼」 的開式寫在一塊兒,或是傳個傳個參數,稍加點內部邏輯代碼,最好就是一同寫在一個類裏面;spa
如:prototype
function Price(personType, price) {設計
//大客戶 5 折繼承
if (personType == 'vip') {接口
return price * 0.5;ip
}
else if (personType == 'old'){ //老客戶 3 折
return price * 0.3;
} else {
return price; //其餘都全價
}
}
咱們把上面的當作一個類,若是要擴展一種價格手段,就得在 Price 裏添加新的 else if,或是修改某個算法邏輯,就得某個 if 或 else if 裏修改, 這是對單個類的修改,並且這種狀況勢必得常常修改這個類,這違反了設計模式的一個原則:對修改關閉,對擴展開放的原則;
並且這些算法,在不一樣客戶面前可能會常常替換,固定參數也不能知足需求;
解決這種問題就可使用策略模式,策略在於關注變化,把各行爲不一樣的實現各自封裝起來,好比要實現一隻動物,走路,叫聲,吃東西的各類表現,就能夠把走路,叫聲,吃東西,就能夠定義三個接口抽象,而後把他們各自具體實現去實現三個接口;
前面說,策略模式是使算法可獨立於使用的客戶的改變,因此策略模式裏,通常是在客戶端定義選擇使用的算法,傳入相應的參數,再根據算法返回結果;
這種有點相似簡單工廠模式,這種再加層 Context 是爲了客戶使用起來更簡單調用,沒必要自處理一些邏輯,讓團隊開發,更趨一致;Context 也能夠作成一個基類,其下能夠有多個實現子類繼承;
Context 跟 Client 能夠改成:
繼承子類只需引用本身的實現接口算法,便可,這樣客戶能夠更簡單的調用,也沒必要理會各類動物使用什麼接口,是怎麼實現的了;
這裏以上面的商場價格手段來實現:
. 實現幾種算法,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();
//普通客戶
//...
這樣即便得 客戶 與算法解藕,又使得修改跟擴展能獨立的進行,不影到客戶端或其餘算法的使用;
其餘說明
策略模式是一個很是實用跟經常使用的設計模式,普通用於商場價格,促銷等場景,他跟工廠模式很像,能夠說是他的一種升級版本;
策略模式相關模式:工廠模式,組合模式;