JS设计模式-策略模式

设计模式总结算法

1、策略模式

策略模式 (Strategy Pattern)又称政策模式,其定义一系列的算法,把它们一个个封装起来,而且使它们能够互相替换。封装的策略算法通常是独立的,策略模式根据输入来调整采用哪一个算法。关键是策略的实现和使用分离。设计模式

1.给个场景

假设咱们如今须要根据访问网站的不一样用户(用户级别分为NORMAL,VIP,SVIP)来判断将反馈不一样的广告。上代码!闭包

function ReturnAdvertisment(userType="NORMAL"){
       if(userType==="NORMAL"){
           return "中华魔力炫白";
       }else if(userType==="VIP"){
           return "肯德基";
       }else if(userType==="SVIP"){
           return "兰博基尼";
       }
   }
复制代码

这个时候咱们调用:app

ReturnAdvertisment("NORMAL");//中华魔力炫白
ReturnAdvertisment("VIP");//肯德基
ReturnAdvertisment("SVIP");//兰博基尼
复制代码

经过输入用户类型加上if else便可以返回不一样的广告信息!可是万一老板说用户的类型要加好几种~!那咋整呢?是否是须要修改函数的代码?这是违反咱们的开放-封闭原则的!函数

2.使用策略模式进行代码优化

将计算返回的代码抽离出来看成一个对象,用户类型看成key值。优化

const userMap={
    NORMAL:function(){
        return "中华魔力炫白"
    },
    VIP:function(){
        return "肯德基"
    },
    SVIP:function(){
        return "兰博基尼"
    }
}

/*计算返回广告类型*/
function ReturnAdvertisment(userType="NORMAL"){
    return userMap[userType]();    
}
复制代码

这样算法的实现和算法的使用分离了,增长新的用户也十分简单了!网站

userMap.SSVIP=function(){
    return "汤臣一品豪宅";
}
复制代码

3.继续进行优化

若是你但愿计算算法隐藏起来,那么能够借助IIFE 使用闭包的方式,这时须要添加增长策略的入口,以方便扩展。spa

const ReturnAdvertismentWrapper = (function() {
    /* 售价计算方式 */
    const userMap={
        NORMAL:function(){
            return "中华魔力炫白"
        },
        VIP:function(){
            return "肯德基"
        },
        SVIP:function(){
            return "兰博基尼"
        }
    }
    
    return {
        returnAdvertisment(userType="NORMAL"){
            return userMap[userType]();    
        },
        addReturnAdvertisment: function(userType, fn) {		
            // 注册新用户
            if (userMap[userType]) return
            userMap[userType] = fn
        }
    }
})()

ReturnAdvertismentWrapper.returnAdvertisment("NORMAL");//中华魔力炫白

ReturnAdvertismentWrapper.addReturnAdvertisment("SSVIP",function(){return "汤臣一品豪宅"})
复制代码

这样算法就被隐藏起来,而且预留了增长策略的入口,便于扩展。设计

4.策略模式通用实现

以上例子中,计算返回广告的过程能够当作策略(Strategy),这些策略能够相互更换,而具体的计算过程能够被称为上下文(Context),全部的策略能够被称做策略合集(StrategyMap)3d

使用通用的方法实现一下:

const StrategyMap={};

function context(type,...rest){
    return StrategyMap[type] && StrategyMap[type](...rest);
}

StrategyMap.NORMAL=function(){
    return "中华魔力炫白";
}

context("NORMAL");//中华魔力炫白

 
复制代码

5.策略模式使用场景

  1. 多个算法只在行为上稍有不一样的场景,这时可使用策略模式来动态选择算法;
  2. 算法须要自由切换的场景;
  3. 有时须要多重条件判断,那么可使用策略模式来规避多重条件判断的状况;
相关文章
相关标签/搜索