设计模式总结算法
策略模式 (Strategy Pattern)又称政策模式,其定义一系列的算法,把它们一个个封装起来,而且使它们能够互相替换。封装的策略算法通常是独立的,策略模式根据输入来调整采用哪一个算法。关键是策略的实现和使用分离。设计模式
假设咱们如今须要根据访问网站的不一样用户(用户级别分为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
便可以返回不一样的广告信息!可是万一老板说用户的类型要加好几种~!那咋整呢?是否是须要修改函数的代码?这是违反咱们的开放-封闭
原则的!函数
将计算返回的代码抽离出来看成一个对象,用户类型看成key值。优化
const userMap={
NORMAL:function(){
return "中华魔力炫白"
},
VIP:function(){
return "肯德基"
},
SVIP:function(){
return "兰博基尼"
}
}
/*计算返回广告类型*/
function ReturnAdvertisment(userType="NORMAL"){
return userMap[userType]();
}
复制代码
这样算法的实现和算法的使用分离了,增长新的用户也十分简单了!网站
userMap.SSVIP=function(){
return "汤臣一品豪宅";
}
复制代码
若是你但愿计算算法隐藏起来,那么能够借助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 "汤臣一品豪宅"})
复制代码
这样算法就被隐藏起来,而且预留了增长策略的入口,便于扩展。设计
以上例子中,计算返回广告的过程能够当作策略(Strategy),这些策略能够相互更换,而具体的计算过程能够被称为上下文(Context),全部的策略能够被称做策略合集(StrategyMap)。3d
const StrategyMap={};
function context(type,...rest){
return StrategyMap[type] && StrategyMap[type](...rest);
}
StrategyMap.NORMAL=function(){
return "中华魔力炫白";
}
context("NORMAL");//中华魔力炫白
复制代码