持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
前言
想要掌握策略模式的精髓,首先就要掌握策略。那我们就先来一起走近策略,看一下究竟是何方神圣吧?
策略:根据形势发展而制定的行动方针和斗争方法。
根据百度百科的释义来看,策略是要根据不同的形势采用不同的方法来应对。带入到我们的策略模式中来,不同的形势是什么呢?广泛的来说就是不同的条件分支,这一点咋看上去有点跟状态模式相交叉了,但是两者之间是不同的。
策略模式与状态模式的异同
相同点:策略模式与状态模式结构上很相似,都是在内容创建了一个状态容器(其实就是个对象),然后根据不同的状态实现对内部方法的调用。
不同点:策略模式的状态之间没有任何依赖关系,相互独立存在,不同策略方法之间可以进行任意的转化;而状态模式的状态相互之间是互斥的。
策略模式的舞台
有关策略模式的🐂已经吹出去了,我们就要拉出来看看,策略模式到底有没有这么厉害。
奇谋巧计
最近甲方商城要开展一场大促,为了促进用户的购买欲望,推出了一系列的活动来进行打折促销。这里的活动分为满100减50,满200减120,服装类商全场8折等,针对不同的活动,我们对于商品的价格计算就要采用不同的计算方式。
如果不采用策略模式的话,可以想象到大家的代码大致就会是这个样子的:
if (// 符合满100减50) {
...
}
if (// 符合满200减120) {
...
}
if (// 符合全场8折) {
...
}
// 返回最终的总价格
但是这里我们完全可以通过策略模式来进行处理。
我们先创建一个策略对象,然后在策略对象内实现每一种折扣方式的计算逻辑。这样的话,针对商品进行商品价格的计算的时候,我们只需要调用符合商品条件的价格策略对应的计算方法即可。
这些折扣方式相互独立,便于我们进行管理和使用。
另外,我们需要对外抛出一个折扣方法,来保证使用者可以自由进行策略的调用。
大致代码如下:
function priceStrategy() {} {
const stargtegy = {
// 满100减50
100() {
...
},
// 符合满200减120
200() {
...
},
// 全场8折
8() {
...
}
}
return function (state, price) {
return stargtegyp[state]?.(price);
}
}
这样处理之后,我们就可以轻松的应对所有的活动了。
结尾
看完了上面的示例,这里我们再来一起总结一下策略模式吧。
策略模式的主要特色是创建一系列的策略算法,每个策略算法的装和处理逻辑都是独立的,所以策略算法之间又可以相互替换,这样就解决了逻辑与算法之间的耦合,大大的提升我们的代码可读性与代码质量。
有关策略模式的内容我们就聊到这里了,希望对家有所帮助。
欢迎大家在下方进行留言交流。