滴,老年卡;滴,学生卡;滴正常卡。我们在坐公交车的时候啊,这个场景每天都在上演。那如果,让你来设计这样一套刷卡的结算逻辑,你最先想到的是用什么设计模式呢?
如果,让我来设计,我最先想到的就是策略模式。另外,我把往期面试题解析的配套文档我已经准备好,想获得的可以在我的煮叶简介中找到。那么什么场景要使用策略模式,什么场景又不应该使用策略模式呢?我们可以先来看官方对策略模式的定义。
1、官方定义
官方原文是:
Define a family of algorithms, encapsulate each one, and make them interchangeable.
翻译过来就是:
将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户,
2、如何理解
看上去,很抽象比较难理解。这里提到三个关键点,一个是封装,二是可以相互替换,三是就算算法变化也不能影响用户的使用。
那对照,前面的公交车刷卡的场景,每种卡的优惠折扣都不一样,并且也结算方式都不一样,但是每种卡可以相互交换使用。比如,增加一个卡种,残疾人卡,只需要重新增加一种折扣就行了,后续继续扩展其他卡种,也不影响已经有卡的用户使用。
在日常开发中,使用策略模式的场景还非常多,比如支付时对支付方式的选择、出行时,对交通工具的选择,等等等等。
3、使用建议
那策略模式适合在哪些场景下使用呢?
需要经常自由切换执行逻辑和规则的场景,就非常适合用策略模式,可以屏蔽算法规则之间的差异,交给用户选择,也可以减少程序中大篇幅的 if...else...判断。比如Spring源码中的Resource资源类,JDK源码中的Comparator类,都是策略模式的应用。
哪些场景下又不适合使用策略模式呢?
如果两种逻辑之间关联性本来就比较大,而且变化也比较快。这种就情况,就算if...else...再多,也不适合用策略模式。比如,每天都有促销活动,价格每天都在浮动,这种情况就不适合使用策略模式。
最后,一句总结策略模式就是把选择权交给用户。如果我的分享对你有帮助,关注我,面试不再难!