JS設想形式——戰略形式

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)
    原文作者:LJun
    原文地址: https://segmentfault.com/a/1190000015242001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞