十二、策略模式(2021/4/28)
发布日期:2021-05-07 05:41:06 浏览次数:17 分类:精选文章

本文共 1732 字,大约阅读时间需要 5 分钟。

策略模式的定义

  • 定义一系列的算法把他们封装起来并且他们之间可以相互替换
  • 核心:将算法的使用和算法的实现分离开来

案例:

#需求年底奖金发放:

绩效为S的人年终奖有4倍工资,
绩效为A的人年终奖有3倍工资,
绩效为B的人年终奖是2倍工资。

以前的写法:

var calculate = function(level,salary){           if(level == 'S'){                   return salary * 4        }        if(level == 'A'){                   return salary * 3        }        if(level == 'B'){                   return salary * 2        }        // 如果再扩展,还要往下写很多一样的代码        // 缺乏弹性}console.log(calculate('S',20000));

策略模式的写法(把变化的和不变化的分开来)

var pS = function (){   }pS.prototype.calculate = function(salary){           return salary * 4}var pA = function (){   }pA.prototype.calculate = function(salary){           return salary * 3}var pB = function (){   }pB.prototype.calculate = function(salary){           return salary * 2}var Bouns = function(){           this.salary = null //初始的薪水        this.strategy = null //绩效等级的策略对象}Bouns.prototype.setSalary = function(salary){           this.salary = salary}Bouns.prototype.setStrategy = function(strategy){           this.strategy = strategy  //这里很巧妙,把一个等级的对象传入,使得this.strategy = 等级函数创建的对象,所以this.strategy 可以使用等级函数对象 的calculate()函数}Bouns.prototype.getBouns = function(){          return this.strategy.calculate(this.salary) //所以this.strategy 可以使用等级函数对象 的calculate()函数}var bouns = new Bouns()bouns.setSalary(10000);bouns.setStrategy(new pS)console.log(bouns.getBouns())

换成函数也是对象的写法:

var strategies = {           "S":function(salary){                   return salary * 4        },        "A":function(salary){                   return salary * 3        },        "B":function(salary){                   return salary * 2        },}var getBouns = function(level,salary){           return strategies[level](salary)}console.log(getBouns('S',10000))
上一篇:十二、策略模式案例(续):表单验证(2021/4/28)
下一篇:十六、reduce方法的详解(2021/4/27)

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年03月29日 12时54分57秒