js策略模式

策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的客户。

先上C#版本:

namespace 策略模式
{
    //现金收取父类
    abstract class CashSuper
    {
        //抽象方法:收取现金,参数为原价,返回为当前价
        public abstract double acceptCash(double money);
    }
}
namespace 策略模式
{
    //正常收费,继承CashSuper
    class CashNormal : CashSuper
    {
        public override double acceptCash(double money)
        {
            return money;
        }
    }
}
namespace 策略模式
{
    //打折收费,继承CashSuper
    class CashRebate : CashSuper
    {
        private double moneyRebate = 1d;
        //初始化时,必需要输入折扣率,如八折,就是0.8
        public CashRebate(string moneyRebate)
        {
            this.moneyRebate = double.Parse(moneyRebate);
        }

        public override double acceptCash(double money)
        {
            return money * moneyRebate;
        }
    }
}
namespace 策略模式
{
    //返利收费,继承CashSuper
    class CashReturn : CashSuper
    {
        private double moneyCondition = 0.0d;
        private double moneyReturn = 0.0d;
        //初始化时必须要输入返利条件和返利值,比如满300返100,则moneyCondition为300,moneyReturn为100
        public CashReturn(string moneyCondition, string moneyReturn)
        {
            this.moneyCondition = double.Parse(moneyCondition);
            this.moneyReturn = double.Parse(moneyReturn);
        }

        public override double acceptCash(double money)
        {
            double result = money;
            //若大于返利条件,则需要减去返利值
            if (money >= moneyCondition)
                result = money - Math.Floor(money / moneyCondition) * moneyReturn;

            return result;
        }
    }
}
namespace 策略模式
{
    //现金收取工厂
    class CashContext
    {
        CashSuper cs = null;

        //根据条件返回相应的对象
        public CashContext(string type)
        {
            switch (type)
            {
                case "正常收费":
                    cs = new CashNormal();
                    break;
                case "满300返100":
                    cs = new CashReturn("300", "100");
                    break;
                case "打8折":
                    cs = new CashRebate("0.8");
                    break;
            }
        }

        public double GetResult(double money)
        {
            return cs.acceptCash(money);
        }
    }
}
//调用:
CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());
totalPrices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
lbxList.Items.Add("单价:" + txtPrice.Text + " 数量:" + txtNum.Text + " "
                + cbxType.SelectedItem + " 合计:" + totalPrices.ToString());

js模拟C#的策略模式:

//现金收取父类
    var CashSuper = function(){};
    CashSuper.prototype.acceptCash = function(money){
        throw new Error(‘具体实现必须由子类重写‘);
    };

    //正常收费,继承CashSuper
    var CashNormal = function(){};
    CashNormal.prototype = new CashSuper();
    CashNormal.prototype.acceptCash = function(money){
         return money;
    };

    //打折收费,继承CashSuper
    var CashRebate = function(moneyRebate){
        this.moneyRebate = moneyRebate;
    };
    CashRebate.prototype = new CashSuper();
    CashRebate.prototype.acceptCash = function(money){
         return money * this.moneyRebate;
    };

    //返利收费,继承CashSuper
    var CashReturn = function(moneyCondition,moneyReturn){
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    };
    CashReturn.prototype = new CashSuper();
    CashReturn.prototype.acceptCash = function(money){
        var result = money;

        ////若大于返利条件,则需要减去返利值
        if (money >= this.moneyCondition)
            result = money - money / this.moneyCondition * this.moneyReturn;
        return result;
    };

    //现金收取工厂
    var CashContext = function(type){
        this.cs;
        switch(type){
            case ‘正常收费‘:
                this.cs = new CashNormal();
            break;
            case ‘满300返100‘:
                this.cs = new CashReturn(300,100);
            break;
            case ‘打8折‘:
                this.cs = new CashRebate(0.8);
            break;
        }
    };
    CashContext.prototype.getResult = function(money){
        return this.cs.acceptCash(money);
    };

    //调用:
    var type = ‘满300返100‘, //计算方式
        price = 300, //单价
        num = 2; //数量

    var csuper = new CashContext(type);
    var totalPrices = csuper.getResult(price * num);
    alert(‘单价:‘ + price + ‘,数量:‘ + num + ‘,计算方式:‘ + type + ‘,合计:‘ + totalPrices);

js特性实现策略模式:

//策略对象
    var cashStrategy = {

        //正常收费
        cashNormal:function(){
            return this.money;
        },

        //打折收费
        cashRebate:function(moneyRebate){
            return this.money * moneyRebate;
        },

        //返利收费
        cashReturn:function(moneyCondition,moneyReturn){
            var result = this.money;

            ////若大于返利条件,则需要减去返利值
            if (this.money >= moneyCondition)
                result = this.money - this.money / moneyCondition * moneyReturn;
            return result;
        }
    };

    //策略工厂
    var CashContext = (function(){

        //收取现金
        var acceptCash = function(){

            var type = [].shift.call(arguments),
                args = arguments;

            return function(money){
                this.money = money;
                return cashStrategy[type].apply(this,args);
            };
        };

        var Fn = function(type){

            this.cs = null;

            switch(type){
                case ‘正常收费‘:
                    this.cs = acceptCash(‘cashNormal‘);
                break;
                case ‘打8折‘:
                    this.cs = acceptCash(‘cashRebate‘,0.8);
                break;
                case ‘满300返100‘:
                    this.cs = acceptCash(‘cashReturn‘,300,100);
                break;
            }
        };

        Fn.prototype.getResult = function(money){
            return this.cs.call(this,money);
        };

        return Fn;
    })();

    //调用:
    var type = ‘满300返100‘, //计算方式
        price = 300, //单价
        num = 2; //数量

    var csuper = new CashContext(type);
    var totalPrices = csuper.getResult(price * num);
    alert(‘单价:‘ + price + ‘,数量:‘ + num + ‘,计算方式:‘ + type + ‘,合计:‘ + totalPrices);

总结:js利用字典匹配就能轻松实现策略模式,由于他是动态语言不少模式是隐含的天生具有的,策略模式也是一个简单到不能算模式的模式。

时间: 2024-10-14 08:05:04

js策略模式的相关文章

js --策略模式

策略模式的定义: 将算法一个个的单独进行封装,并且使他们可以相互替换.此模式让算法的变化不会影响到使用算法的客户. 先回顾一下,我们在做项目的过程中,是不是经常会遇见因为业务逻辑的关系,我们会写好多的is-else语句进行判断,或者使用switch语句,在后期添加新的需求的时候,比较头疼的需要去改这些判断语句,而且有时候会,添加一条判断语句,一不小心会导致所有的判断都失效呢?举一个之前项目中用到的例子把,简化一下.有一个按钮在不同的条件下,跳转到不同的页面,如下: toseeHouse() {

理解js设计模式之策略模式

策略模式的定义:定义一系列的算法,然后根据实际情况去调用 一个小插曲:最近在项目的过程中接手了一个比较复杂的需求,由于是旧的项目用新的框架重构,所以能够看见以前的代码,吸取下前人代码的精华,复用一些可用的代码,免得自己写半天..当然这篇的主题是策略模式,不会离题,因为当我完成了Version 1 后,项目里面大量的if-else 字段的验证都放在一个函数里面,而且不同字段有些还会相互影响,导致代码很长很乱大概有几十行的if else ,丝毫没有条理:这个时候,需要去重构这个原本的底层验证函数,那

JS设计模式——策略模式

核心:定义一些列的算法(逻辑)封装起来,并且它们是平等关系可以相互替换js中的策略模式关键字:策略和业务分离 (一)基本实现 常见代码: function playGame(gameName){ let str; if(gameName == 'footBall'){ str = '不喜欢玩足球' }else if(method == 'basketball'){ str = '不喜欢玩蓝球' }else if(method == 'pingpang'){ str = '不喜欢玩乒乓' }els

js设计模式(一)---策略模式

策略模式: 定义: 定义一系列的算法,把他们一个个封装起来,并且是他们可以相互替换 应用场景: 要求实现某一个功能有多种方案可以选择.比如:条条大路通罗马 实现: 场景,绩效为 S的人年终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而绩效为 B的人年终奖是 2倍工资.假设财务部要求我们提供一段代码,来方便他们计算员工的年终奖. var calculateBonus = function( performanceLevel, salary ){ if ( performanceLevel =

JS设计模式(2)策略模式

什么是策略模式? 定义:根据不同参数可以命中不同的策略 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:有许多种情况,而区分它们的只是他们直接的行为. 如何解决:通过一个hash对象,来映射不同的策略. 优点: 1.算法可以自由切换. 2.避免使用多重条件判断. 3.扩展性.复用性良好. 缺点: 1.策略类会增多. 2.所有策略类都需要对外暴露. 使用场景: 1.需要动态地根据行为改变运行方法.2.为了减少代码,同时为了让代码具有更好的可读性.3

JS常用的设计模式(9)——策略模式

策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.一个小例子就能让我们一目了然. 回忆下jquery里的animate方法. $( div ).animate( {"left: 200px"}, 1000, 'linear' ); //匀速运动 $( div ).animate( {"left: 200px"}, 1000, 'cubic' ); //三次方的缓 这2句代码都是让div在1000ms内往右移动200个像素. linear(

策略模式的JS实现

var S = function (salary) { return salary * 4; }; var A = function (salary) { return salary * 3; }; var B = function (salary) { return salary * 2; }; var calculateBonus = function (func, salary) { return func(salary); }; calculateBonus(S, 10000); 能看出

大熊君说说JS与设计模式之------策略模式Strategy

一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并且可以在运行时刻自由切换.工厂模式重点是用来创建对象. 策略模式应用比较广泛,比如:我们现在要定义数据交换格式,现有三种方案可选1,XML  2,JSON  3,CSV就可以使用策略模式实现. 这里我要强调的是------我们是针对不同数据源选择不同方案,针对的都是同一事物做相同意图的操作只是方案不

【JS设计模式】策略模式的代码示例

策略模式的概念引用:        在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这两种实现方法我们都可以称之为硬编码,如