🤵♂️ 个人主页:奇想派
👨💻 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,喜欢分享心得,追求成为编程达人 🎖️!
🗺️学海无涯苦作舟,🛤️编程之路无悔路!
📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注👀,不胜感激!
什么是策略模式?策略模式是对应一个函数的不同的判断能及时使用不同的策略,这种类型的设计模式属于行为型模式。策略模式的好处是能自由切换不同判断,避免多重条件判断,扩展性会变得极其良好。
平时很多程序员有个不好的习惯,喜欢无限嵌套if-else,这个代码看起来冗长又危险,为什么说危险呢?因为后续如果有人接手或者这位同事过了好久去维护,就会发现代码改动无从下手,因为嵌套太多层了,每次有新条件又要重新修改,极度麻烦,见下面一个商城购物简单逻辑,通过判断用户会员等级,购买商品时赠送相应积分的代码。具体规则:
1、1级会员
享受价格8成积分;2、2级会员
按条件赠送积分:如果购买商品价格是低于或等于100
,赠送6成;如果商品价格高于 100
,则赠送价格7成的积分;4、普通会员没优惠。
function giveIntegral(price, userLevel) {
if (userLevel === "1") {
return price * 0.8;
}
if (userLevel === "2") {
if (price <= 100) {
return price * 0.6;
} else {
return price * 0.7;
}
}
return 0;
}
首先,这行代码违反了单一职责原则,函数giveIntegral
做了太多事情,可读性较差,继续嵌套很容易出现bug
,而且一个条件出现bug
,整个函数都是不可靠的。也能难应付的了需求的变动。假如又出现新的会员等级,对应新的规则,比如新增了3级会员:购买商品价格高于100的统一赠送50点积分。
function giveIntegral(price, userLevel) {
if (userLevel === "1") {
return price * 0.8 ;
}
if (userLevel === "2") {
if (price <= 100) {
return price * 0.6 ;
} else {
return price * 0.7 ;
}
}
if (userLevel === "3") {
if (price >= 100){
return 50 ;
}
}
return 0;
}
看到没,需求方新增了一个简单需求,代码逻辑就改动了,这种做法违背了开闭原则(对扩展开放,对修改关闭)。改动已有功能很容易出现新错误,整个giveIntegral
函数会越来越臃肿,越来越难维护,越来越容易出bug
。如果出现新会员等级,或者新的价格方案,那就无限加入新的逻辑在giveIntegral
函数。
此刻如果加入策略模式,即让这些if-else改成对应的会员等级和积分策略。不同的会员等级,处理不同的赠送积分事项,即使新增了新的会员等级,也能应付自如:
如图所示,对应的xxxGiveTegral()
函数是积分处理的函数,比如level1GiveTegral处理示例:
level1GiveTegral(){
return price * 0.8 ;
}
其他积分处理函数,类似加入积分处理逻辑即可。
映射关系(策略名称与处理函数之间的映射)如下:
const tagralStrategies = {
"userLevelIs1": level1GiveTegral(),
"userLevelIs2": level2GiveTegral(),
"userLevelIs3": level3GiveTegral(),
"userLevelIsDefault": defaultGiveTegral()
};
将会员等级与积分策略结合起来,赠送积分函数就可以优化成如下:
#根据不同的用户等级,调取不同的赠送积分策略
function giveIntegral(price, userLevel) {
return tagralStrategies[userLevel](price);
}
之前的代码逻辑如下:
加入策略模式的代码逻辑如下:
这样虽然多了几个函数,但代码的可读性大大提升,也不用一个函数写完全部逻辑。
策略模式适用于判断条件很多、各个判断条件下的代码相互独立,此刻可以考虑将每个判断条件下的代码封装成独立的函数,然后建立判断条件和具体策略的映射关系。这样冗长的if-else就彻底清除了,代码变得干净整洁,可读性大大提升,也方便后期开发小伙伴们维护代码。
🚀博主个人博客网站:奇想派
🎨文章首发平台:微信公众号【编程达人】
🔥原创不易!各位小伙伴觉得文章不错的话,可以关注我,进行评论💬点赞👍收藏📂三连走起!谢谢大家!