美文网首页前端是万能的
《JavaScript设计模式与开发实践》之策略模式

《JavaScript设计模式与开发实践》之策略模式

作者: 肆意木 | 来源:发表于2019-11-24 18:28 被阅读0次

    此文章只是我自己总结下来让自己有一天用到的时候,翻出来复习的,接受指点,但不接受杠,谁怼我,我怼谁....

    模式的主旨:将不变的部分和变化的部分隔开 。

    定义: 一系列的算法,把它们一个个封装起来,并且使它们可以相互替换

    目的:将算法的使用与算法的实现分离开来。

    策略模式种有两个概念,策略类与环境类:
    策略类: 封装类具体的算法,并负责具体的计算过程;
    环境类: 接受客户的请求,随后把请求委托给某一个策略类。


    栗子

    直接把官方的计算奖金的栗子搬过来。

    需求:很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为 S 的人年终奖有 4 倍工资,绩效为 A 的人年终奖有 3 倍工资,而绩效为 B 的人年终奖是 2 倍工资。假设财务部要求我们提供一段代码,来方便他们计算员工的年终奖。

    在不了解策略模式之前我们实现的方案很可能如下:

    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 
    

    但是,今天我们了解类策略模式,用到策略模式之后,我们实现的方案完全可以如下:

    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 
    

    虽然看着代码行数变多了,但是后者的好处那也是显而易见的,在我看来最直观的优势就是,代码逼格提高了好几个档次。


    策略模式的优点:
    1. 策略模式利用组合、委托和多态技术和思想,可以有效地避免多重条件选择语句;
    2. 策略模式提供了对开放——封闭原则的完美支持,将算法封装在独立的环境中,使得它们易于切换,易于理解,易于扩展;
    3. 策略模式中的算法也可以复用在系统的其它地方,从而避免许多重复的复制粘贴工作;
    4. 在策略模式中利用组合和委托来让 Context 拥有执行算法的能力,这也是继承的一种更轻便的替换方案。

    相关文章

      网友评论

        本文标题:《JavaScript设计模式与开发实践》之策略模式

        本文链接:https://www.haomeiwen.com/subject/sxalwctx.html