设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

60 | 策略模式(上):如何避免冗长的if-else/switch分支判断代码?

getStrategy
strategies
DiscountStrategyFactory
DiscountStrategy
OrderService
Application
UserCache
StrategyFactory
ConcreteStrategyB
ConcreteStrategyA
Strategy
如何利用策略模式避免分支判断?
策略的使用
策略的创建
策略的定义
课堂讨论
重点回顾
策略模式的原理与实现
策略模式
回调
模板模式
如何避免冗长的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
立即购买
登录 后留言

全部留言(122)

  • 最新
  • 精选
  • 卖火柴的托儿索
    这个策略和多态有什么区别?感觉用法差不多

    作者回复: 完全两个东西 一个是模式 一个是技术 一个侧重应用场景 一个侧重代码实现

    2020-04-26
    3
    7
  • 改名不换人
    请问各位一个问题:如果在spring应用中,Map策略表中的对象应该是new创建的,还是用autowired注入?

    作者回复: 要是自己new的,spring容器是不管理的,也就是你在其他地方无法自动注入

    2020-07-30
    3
  • 宁锟
    仍然可以用查表法,只不过存储的不再是实例,而是class,使用时获取对应的class,再通过反射创建实例
    2020-03-20
    22
    271
  • 下雨天
    策略模式和工厂模式区别: 工厂模式 1.目的是创建不同且相关的对象 2.侧重于"创建对象" 3.实现方式上可以通过父类或者接口 4.一般创建对象应该是现实世界中某种事物的映射,有它自己的属性与方法! 策略模式 1.目的实现方便地替换不同的算法类 2.侧重于算法(行为)实现 3.实现主要通过接口 4.创建对象对行为的抽象而非对对象的抽象,很可能没有属于自己的属性。
    2020-03-20
    3
    84
  • Michael
    一般而言Java web开发中我们均使用spring框架,可以使用运行时自定义注解给具体的策略类打上注解,将具体的策略类放于spring 容器中,工厂中注入直接根据类型获取即可.不实用spring框架的话,也可以用Java的反射做到获取到具体的策略类
    2020-03-20
    47
  • 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-06
    4
    26
  • 攻城拔寨
    策略模式通常跟工厂一起配合使用。 策略侧重如何灵活选择替换, 工厂侧重怎么创建实例
    2020-03-20
    23
  • Jasongrass
    if else 不是必须要解决的问题,如果放在工厂类中,逻辑比较简单,未来的变动也不会很大,就是 OK 的。
    2020-03-23
    5
    16
  • aoe
    原来策略模式的精髓就是:用Map代替冗长的if-else/switch分支判断! 哇!
    2020-07-28
    2
    15
  • 东征
    仍然使用查表法,表中存类型和class,根据类型获取对象时,使用class动态创建。或者表中存类型和一个创建函数,根据类型获取对象时,获取到创建函数,调用创建函数创建新对象(java里可以用lambda或者对象代替函数)
    2020-04-03
    2
    12
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部