60 | 策略模式(上):如何避免冗长的if-else/switch分支判断代码?
王争
该思维导图由 AI 生成,仅供参考
上两节课中,我们学习了模板模式。模板模式主要起到代码复用和扩展的作用。除此之外,我们还讲到了回调,它跟模板模式的作用类似,但使用起来更加灵活。它们之间的主要区别在于代码实现,模板模式基于继承来实现,回调基于组合来实现。
今天,我们开始学习另外一种行为型模式,策略模式。在实际的项目开发中,这个模式也比较常用。最常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断。不过,它的作用还不止如此。它也可以像模板模式那样,提供框架的扩展点等等。
对于策略模式,我们分两节课来讲解。今天,我们讲解策略模式的原理和实现,以及如何用它来避免分支判断逻辑。下一节课,我会通过一个具体的例子,来详细讲解策略模式的应用场景以及真正的设计意图。
话不多说,让我们正式开始今天的学习吧!
策略模式的原理与实现
策略模式,英文全称是 Strategy Design Pattern。在 GoF 的《设计模式》一书中,它是这样定义的:
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了如何利用策略模式来避免冗长的if-else/switch分支判断代码。通过定义、创建和使用策略类,以及利用策略工厂类来动态确定使用哪种策略,读者可以学习到策略模式的核心概念和实际应用。文章通过清晰的示例和详细的讲解,强调了策略模式的灵活性和可维护性,以及如何通过策略模式来移除if-else分支判断,从而提高代码的可读性和可扩展性。此外,文章还提到了策略模式适用于根据不同类型的动态决定使用哪种策略的应用场景。整体而言,本文为读者提供了一种有效的代码优化思路,对于希望了解策略模式及其实际应用的读者来说,是一篇值得阅读的文章。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》,新⼈⾸单¥98
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(122)
- 最新
- 精选
- 卖火柴的托儿索这个策略和多态有什么区别?感觉用法差不多
作者回复: 完全两个东西 一个是模式 一个是技术 一个侧重应用场景 一个侧重代码实现
2020-04-2637 - 改名不换人请问各位一个问题:如果在spring应用中,Map策略表中的对象应该是new创建的,还是用autowired注入?
作者回复: 要是自己new的,spring容器是不管理的,也就是你在其他地方无法自动注入
2020-07-303 - 宁锟仍然可以用查表法,只不过存储的不再是实例,而是class,使用时获取对应的class,再通过反射创建实例2020-03-2022271
- 下雨天策略模式和工厂模式区别: 工厂模式 1.目的是创建不同且相关的对象 2.侧重于"创建对象" 3.实现方式上可以通过父类或者接口 4.一般创建对象应该是现实世界中某种事物的映射,有它自己的属性与方法! 策略模式 1.目的实现方便地替换不同的算法类 2.侧重于算法(行为)实现 3.实现主要通过接口 4.创建对象对行为的抽象而非对对象的抽象,很可能没有属于自己的属性。2020-03-20384
- Michael一般而言Java web开发中我们均使用spring框架,可以使用运行时自定义注解给具体的策略类打上注解,将具体的策略类放于spring 容器中,工厂中注入直接根据类型获取即可.不实用spring框架的话,也可以用Java的反射做到获取到具体的策略类2020-03-2047
- zhengyu.nie查表策略还是挺常见的,搭配java.util.function各种接口挺好用的。 private final Map<String, Function<String, String>> PHONE_FUN_FACTORY = ImmutableMap.of( MessageDestination.LEGAL_PERSON.name(), legalPersonPhoneFunc(), MessageDestination.ACTUAL_CONTROL.name(), actualPersonPhoneFunc() ); 我比较喜欢建一个StrategyContext类,简单工厂+策略模式。 Context类存在一个成员变量xxx,new StrategyContext(xxx).apply(); 然后StrategyContext内部存放一个表,value是一堆function,通过成员变量查表找对应的func.apply即可2020-05-06426
- 攻城拔寨策略模式通常跟工厂一起配合使用。 策略侧重如何灵活选择替换, 工厂侧重怎么创建实例2020-03-2023
- Jasongrassif else 不是必须要解决的问题,如果放在工厂类中,逻辑比较简单,未来的变动也不会很大,就是 OK 的。2020-03-23516
- aoe原来策略模式的精髓就是:用Map代替冗长的if-else/switch分支判断! 哇!2020-07-28215
- 东征仍然使用查表法,表中存类型和class,根据类型获取对象时,使用class动态创建。或者表中存类型和一个创建函数,根据类型获取对象时,获取到创建函数,调用创建函数创建新对象(java里可以用lambda或者对象代替函数)2020-04-03212
收起评论