策略模式說白了就是要實現某乙個功能,有多種方案可以選擇。我們定義一系列的演算法,把它們乙個個封裝起來,並且使它們可以相互轉換。
既然提到具體的功能,那只能通過開發常遇到的一些案例去解讀策略模式
比如我們要給乙個公司開發乙個年終獎發獎勵的功能:
當績效型別為「s」時,4個月的獎金
當績效型別為「a」時,3個月獎金
當績效型別為「b」時,2個月獎金
//我們很容易就想到用performancelevel, salary分別代表績效等級和基本月工資。然後大致的**如下
var calculatebonus = function(performancelevel, salary)
if (performancelevel === 'a')
if (performancelevel === 'b')
};console.log(calculatebonus('b', 20000)); // 輸出:40000
console.log(calculatebonus('s', 6000)); // 輸出:24000
// 一看沒問題吧,功能都實現了,if-else俠有下面兩個缺點
calculatebonus 函式既進行了等級判斷,又返回了績效獎金,違背了函式的「單一功能」原則'
不僅如此,它還違背了「開放封閉」原則,假設哪一天老闆又要加個sss級績效給自己秘書咋辦,咱不得改動這個主體函式。
根據上面的問題,結合我們學習的設計模式去改造函式
var performances = function(salary) ;
var performancea = function(salary) ;
var performanceb = function(salary) ;
var calculatebonus = function(performancelevel, salary)
if (performancelevel === 'a')
if (performancelevel === 'b')
};
再思考一下,我們是遵循了單一功能原則,但是每次新增乙個performancelevel時,我們還是要去改calculatebonus 這個函式,現在我們的需求是
s---> salary * 4這麼一想,我們是不是很容易就想到了對映關係,那麼常用的對映不就是物件的鍵值對嘛a---> salary * 3
b---> salary * 2
var strategies = ,
a: function(salary) ,
b: function(salary)
};var calculatebonus = function(level, salary) ;
console.log(calculatebonus('s', 20000)); // 輸出:80000
console.log(calculatebonus('a', 10000)); // 輸出:30000
這樣我們再也不用擔心老闆要給多少個秘書新增績效了
strategies['sss'] = function(salary)
...
我們也可以直接用重構**
var performances = function (){}
performances.prototype.calculate = function(salary);
var performancea = function (){}
performances.prototype.calculate = function(salary);
var performanceb = function (){}
performances.prototype.calculate = function(salary);
var bonus = function();
bonus.prototype.setsalary = function( salary );
bonus.prototype.setstrategy = function( strategy );
bonus.prototype.getbonus = function();
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
下面順便附上es6 class的寫法
// 定義策略類
class performances
}class performancea
}class performanceb
}// 定義獎金類
class bonus
// 設定原始工資
setsalary(salary)
// 設定員工績效等級對應的策略物件
setstrategy(strategy)
getbonus()
}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
下面我們實現乙個form表單提交的多條件校驗的例子
設計模式之策略模式
include using namespace std 飛行行為介面類 class flystrategy 高空飛行行為具現類 class heightfly public flystrategy virtual void fly private heightfly 低空飛行行為具現類 class ...
設計模式之 策略模式
策略模式 strategy pattern 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義了一系列演算法的方法,從概念上來看,所以得這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各...
設計模式之策略模式
何為策略,就是可以實現目標的方案集合。而完成一項任務有不同的方式,每一種方式稱為乙個策略。策略模式就是定義一系列演算法,將每乙個演算法封裝起來,並讓他們可以相互替換。很簡單的乙個例子 年底移動公司推出很多的活動,比如說 存話費贈食用油,交話費贈話費,買手機贈話費 等等。推出這些個活動目的就只有乙個,...