JS设计模式 之 策略模式

什么是策略模式?

  策略模式就是将一系列算法封装起来,并使它们相互之间可以替换。被封装起来的算法具有独立性,外部不可改变其特性。

 

 

以计算薪资为例,属性名为各个薪资档位,属性值为相应计算方法

一般开发时间较短人会想到这种写法

var performanceS = function( salary ){
    return salary * 4;
};
var performanceA = function( salary ){
    return salary * 3;
};
var performanceB = function( salary ){
    return salary * 2;
};
var calculateBonus = function( performanceLevel, salary ){
    if ( performanceLevel === 'S' ){
        return performanceS( salary );
    }
    if ( performanceLevel === 'A' ){
        return performanceA( salary );
    }
    if ( performanceLevel === 'B' ){
        return performanceB( salary );
    }
};
calculateBonus( 'A' , 10000 ); // 输出:30000

  或者

var calculateBonus = function( performanceLevel, salary ){
    if ( performanceLevel === 'S' ){
        return salary * 4;
    }
    if ( performanceLevel === 'A' ){
        return salary * 3;
    }
    if ( performanceLevel === 'B' ){
        return salary * 2;
    }
};
calculateBonus( 'B', 20000 ); // 输出:40000
calculateBonus( 'S', 6000 ); // 输出:24000

  虽然代码看起来简洁,但是该函数比较庞大,包含了很多if语句,这些语句需要覆盖所有的逻辑分支;该函数缺乏弹性,如果增加了一种新的绩效等级C,或者想把绩效S的奖金系数改为5,必须深入calculateBonus函数的内部实现,违反开放封闭原则

 

策略模式:没有对比就没有伤害 真香

var strategies = {
    "S": function( salary ){
        return salary * 4;
    },
    "A": function( salary ){
        return salary * 3;
    },
    "B": function( salary ){
        return salary * 2;
    }
};
var calculateBonus = function( level, salary ){
    return strategies[ level ]( salary );
};
console.log( calculateBonus( 'S', 20000 ) ); // 输出:80000
console.log( calculateBonus( 'A', 10000 ) ); // 输出:30000

 

posted @ 2020-12-28 21:54  雨中愚  阅读(1925)  评论(0编辑  收藏  举报