带你读《2022技术人的百宝黑皮书》——浅析设计模式2 —— 策略模式(3)
https://developer.aliyun.com/article/1262319?groupCode=taobaotech
优缺点及适用场景
优点
1. 具体策略类之间可自由切换,由于具体策略类都实现同一个抽象策略接口,所以它们之间可以自由切换。
2. 支持“开闭原则”,扩展增加一个新策略时只需添加一个具体策略类即可,基本不需要改变原有的代码。
3. 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。
缺点
1. 客户端必须知道所有的具体策略类,并理解不同具体策略的区别、自行决定使用哪一个策略类。
2. 策略模式将产生很多具体策略类,在一定程度上增加了系统中类的个数(可通过使用享元模式在一定程度上减少 对象数量)。
适用场景
1. 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到具体策略类中。
2. 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它 们各自的策略类中以代替这些条件语句,就能避免使用难以维护的多重条件选择语句,并体现面向对象涉及的概 念。
3. 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节,提高算法的保密性与安全性。
4. 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
总结
策略模式是一个比较容易理解和使用的设计模式,它仅封装算法,方便新算法插入系统中、老算法从系统中退休。 本文在分析策略模式的缺点时提到,策略模式并不决定在何时使用何种算法,算法选择由客户端来决定,虽然这在 一定程度上提高了系统的灵活性,但客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,增加了客 户端的使用难度。
上一篇文章提到,策略模式和工厂模式有一定相似之处,在于它们的模式结构,因此有时候会让人混淆不清。实际 上,这两者之间存在较多差异:工厂模式是创建型模式,作用是创建对象,它关注对象如何创建,主要解决的是资 源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关;策略模式是行为型模式,作用 是让一个对象在许多行为中选择一种行为,它关注行为如何封装,通过定义策略族来实现策略的灵活切换与扩展, 并让策略的变化独立于使用策略的客户。
另外,很多场景下策略模式和工厂模式可以结合使用,共同发挥优势起到相辅相成的作用。比如,策略模式的缺点 之一是用户必须清楚所有的具体策略算法,这样具体策略难免暴露出去,并且要由上层模块初始化,这与迪米特法 则相悖(最少知识原则),而上层模块和底层模之间的解耦,可以让工厂模式来完成。两者结合之后,对于上层模 块而言不需要知道每种具体策略,只要通过 Context 就可以实现策略模式。(至于如何结合策略模式和工厂模式, 大家可以上网搜索哦,已经有很多大佬给出了具体的案例和代码示例,这里就不再赘述了)
下篇预告
至此,我们已经学习了两种类型的设计模式,即创建型模式(工厂模式)和行为型模式(策略模式),看过文章的 朋友们一定知道,每篇文章开头都会对 23 种经典的设计模式进行罗列,其中划分出三大类设计模型:创建型模 式、结构型模式和行为型模式。不知道你们是否和我一样好奇结构型模式有什么特点和适用场景?实际生产中最常 用的结构型模式是什么?下一篇文章我们一起认识和了解结构型模式,敬请期待!
团队介绍
我们是大聚划算技术团队。
使命:让货品和心智运营变得高效且有确定性!
愿景:与运营、产品合力,打造最具价格优惠心智的购物入口,最具爆发性的营销矩阵。
职责:负责支持聚划算、百亿补贴、天天特卖等业务。我们聚焦优惠和选购体验,通过数智化驱动形成更有效率和 确定性的货品运营方法论,为消费者提供精选和极致性价比的商品,为商家提供更具爆发确定性的营销方案。
这是一支极具业务 sense,又具备复杂业务系统架构和设计经验的团队。