zoukankan      html  css  js  c++  java
  • JavaScript设计模式_02_策略模式

    在程序设计中,我们常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
    这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。

    /*
     * pre:策略模式
     * 示例:公司计算奖金,分A、B、C 三种绩效,计算方式如下
     * 绩效为A,奖金乘以系数5
     * 绩效为B,奖金乘以系数4
     * 绩效为C,奖金乘以系数3
     */
    //-------- 示例1 ----------
    var calculateBonus = function(performanceLevel, salary) {
        if(performanceLevel === 'A') {
            return salary * 5;
        }
        if(performanceLevel === 'B') {
            return salary * 4;
        }
        if(performanceLevel === 'C') {
            return salary * 3;
        }
    };
    console.log(calculateBonus('A', 2000));
    /*
       缺点:1、函数体系庞大,拥有太多的if-else语句;
          2、如果增加绩效D,需修改内部函数,违背封闭-开放原则;
          3、复用性差,其他地方如果用到计算奖金,只能复制粘贴;
     */
    //--------- 示例2 ------------
    var performanceA = function(salary) {
        return salary * 5;
    };
    var performanceB = function(salary) {
        return salary * 4;
    };
    var performanceC = function(salary) {
        return salary * 3;
    };
    var calculateBonus = function(performanceLevel, salary) {
        if(performanceLevel === 'A') {
            return performanceA(salary);
        }
        if(performanceLevel === 'B') {
            return performanceB(salary);
        }
        if(performanceLevel === 'C') {
            return performanceC(salary);
        }
    };
    console.log(calculateBonus('A', 2000)); 
    /*
      缺点:1、函数体系庞大,系统变化时缺乏弹性
     */
    //--------- 示例3 ------------
    // 策略模式重构:定义一系列算法,将它们一个个封装起来。
    var performanceA = function(){};
    performanceA.prototype.caculate = function(salary){
        return salary * 5;
    };
    var performanceB = function(){};
    performanceB.prototype.caculate = function(salary){
        return salary * 4;
    };
    var performanceC = function(){};
    performanceC.prototype.caculate = function(salary){
        return salary * 3;
    };
    
    var Bonus = function(){
        this.salary = null;
        this.strategy = null;
    };
    Bonus.prototype.setSalary = function(salary){
        this.salary = salary;
    };
    Bonus.prototype.setStrategy = function(strategy){
        this.strategy = strategy;
    }
    Bonus.prototype.getBonus = function(){
        return this.strategy.caculate(this.salary);
    }
    
    var bonus = new Bonus();
    bonus.setSalary(2000);
    bonus.setStrategy(new performanceA());
    console.log(bonus.getBonus());
    
    // ----------- 示例4 ---------------
    // javaScript版本
    var Strategies = {
        "A":function(salary){
            return salary * 5;
        },
        "B":function(salary){
            return salary * 4;
        },
        "C":function(salary){
            return salary * 3;
        }    
    };
    var caculateBonus = function(level,salary){
        return Strategies[level](salary);
    };
    console.log(caculateBonus("A",2000));
  • 相关阅读:
    1040 Longest Symmetric String (25)
    1068 Find More Coins (30)
    1045 Favorite Color Stripe (30)
    1008 数组元素循环右移问题 (20)
    1007. 素数对猜想
    1005. 继续(3n+1)猜想 (25)
    1001. 害死人不偿命的(3n+1)猜想 (15)
    递归经典面试题_ 小例
    简单实现_控制台小时钟
    使用Timer组件_实现定时更改窗体颜色
  • 原文地址:https://www.cnblogs.com/stinchan/p/6970628.html
Copyright © 2011-2022 走看看