1. 引見
戰略形式是JS設想形式中一大主要的形式有着普遍的運用
2. 定義
定義一系列的算法,把它們一個個封裝起來,而且使它們能夠互相替代
3. 運用
依據品級、工資盤算獎金等相似狀況、運用差別的動畫結果、表單考證等
4. 頭腦
把算法完成和算法挪用離開
5. 完成
1. 基礎的戰略形式
這個例子是依據傳統的面向對象言語舉行革新的,差別的類都完成了雷同的要領,傳入差別的實例都能夠挪用雷同的要領。這个中用到了組合、託付、多態的頭腦。个中把差別的完成歷程舉行拆分,分紅performanceS,performanceA,這是組合的頭腦,都完成雷同的要領calculate這是多態的頭腦,多態的意義是差別的對象挪用雷同的要領其結果是差別的。再經由過程Bonus類去挪用這是託付。
var performanceS=function(){}
performanceS.prototype.calculate=function(salary){
return salary*4
}
var performanceA=function(){}
performanceA.prototype.calculate=function(salary){
return salary*3
}
var Bonus=function(){
this.salary=""
this.strategy=""
}
Bonus.prototype.setSalary=function(salary){
this.salary=salary
}
Bonus.prototype.setStrategy=function(strategy){
this.strategy=strategy
}
Bonus.prototype.getBonus=function(){
return this.strategy.calculate(this.salary)
}
var bonus = new Bonus()
bonus.setSalary(1000)
bonus.setStrategy(new performanceS())
console.log(bonus.getBonus())//4000
bonus.setStrategy(new performanceA())
console.log(bonus.getBonus())//3000
2. JS版本戰略形式
在上個例子中雖然開端完成了戰略形式,然則是模仿的傳統面向對象言語,而JS的完成更加簡樸,直接把本來的strategy實例定義成函數,本來的Bonus類用calculateBonus函數來託付。組合的頭腦也照樣比較顯著,多態在這裏表現得不是很顯著,在strategieslevel這句中表現。
var strategies={
S:function(salary){
return salary*4
},
A:function(salary){
return salary*3
}
}
calculateBonus=function(level,salary){
return strategies[level](salary)
}
console.log(calculateBonus('S',1000))//4000
3. 表單考證例子
在現實項目中常常須要對錶單舉行考證,用戰略形式去完成表單考證是一種很不錯的要領
var stratiges={
isNotEmpty:function(val,errormsg){
if(val.length<0){
return errormsg
}
},
minLen:function(val,minlen,errormsg){
if(val.length<minlen){
return errormsg
}
}
}
var Validate=function(){
this.cache=[]
}
Validate.prototype.add=function(value,rules){
for(var i=0,len=rules.length;i<len;i++){
var rule=rules[i]
var self=this;
(function(rule){
var arr = rule.strategy.split(":")
var strategy=arr.shift()
arr.unshift(value)
arr.push(rule.errormsg)
self.cache.push(function(){
return stratiges[strategy].apply(null,arr)
})
})(rule)
}
}
Validate.prototype.start=function(){
for(var i=0,len=this.cache.length;i<len;i++){
var errorMsg = this.cache[i]()
if(errorMsg){
return errorMsg
}
}
}
var validate = new Validate()
validate.add("yyyy",[{strategy:"isNotEmpty",errormsg:"不能為空"},{strategy:"minLen:7",errormsg:"不能少於7位"}])
var errormsg = validate.start()
console.log(errormsg)