策略模式

策略模式的定义

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

一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体 的算法,并负责具体的计算过程。 第二个部分是环境类 Context,Context 接受客户的请求,随后 把请求委托给某一个策略类

策略模式的应用

  1. 计算奖金

需求:绩效为 S 的人年 终奖有 4 倍工资,绩效为 A 的人年终奖有 3 倍工资,而绩效为 B 的人年终奖是 2 倍基于类的实现方式:

// 定义算法类
    var performanceS = function() {};
    performanceS.prototype.calculate = function(salary) {
        return salary * 4;
    };
    var performanceA = function() {};
    performanceA.prototype.calculate = function(salary) {
        return salary * 3;
    };
    var performanceB = function() {};
    performanceB.prototype.calculate = function(salary) {
        return salary * 2;
    };

    // 定义奖金规则类
    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.calculate(this.salary);
    };
   
    var bonus = new Bonus();
    bonus.setSalary(10000);

    bonus.setStrategy(new performanceS());
    console.log(bonus.getBonus()); // 输出:40000 

    bonus.setStrategy( new performanceA() ); // 重新设置策略对象
    console.log(bonus.getBonus()); // 输出:30000

JavaScript版本:

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




                                                                              



摘自:曾探《JavaScript设计模式与开发实践》

转载于:https://www.cnblogs.com/Paul-Yellow/p/10890264.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值