🍄 策略模式

吞佛童子2022年6月20日
  • 设计模式
  • 行为型
  • 策略模式
大约 3 分钟

🍄 策略模式

1. 概述

1) 是什么

  • 一个类的行为或其算法可以在运行时更改
  • 运行时我给你这个类的方法传不同的“key”,你这个方法会执行不同的业务逻辑
  • 策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换
  • 策略模式使得算法可以在不影响到客户端的情况下发生变化
  • 策略模把行为和环境分开
  • 环境类负责维持和查询行为类,各种算法在具体的策略类中提供
  • 由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端

2) 优点

  • 算法策略可以自由实现切换
  • 扩展性好,加一个策略,只需要增加一个类
  • 抽象出了接口,将业务逻辑封装成一个一个的实现类,任意地替换。在复杂场景(业务逻辑较多)时比直接 if else 来的好维护些

3) 缺点

  • 策略类数量多
  • 需要维护一个策略枚举,让别人知道你当前具有哪些策略

2. 代码示例

1) 场景 & 目标

  • 多个 if ... else ...
  • 存在问题:
    • 分支过多,维护困难,可读性低
      • 违背 单一职责 原则
    • 需要增加一种条件时,需要 修改原有代码
      • 违背 开闭 原则
if(type == 'A') {
  ...
} else if(type == 'B') {
  ...
} else if(...) {
  ...
}

2) 代码示例


3. 应用

1) Resource 接口

  • Resource 接口本身没有提供访问任何底层资源的实现逻辑,针对不同的底层资源,Spring 将会提供不同的 Resource 实现类,不同的实现类负责不同的资源访问逻辑
    • UrlResource:访问网络资源的实现类。
    • ClassPathResource:访问类加载路径里资源的实现类。
    • FileSystemResource:访问文件系统里资源的实现类。
    • ServletContextResource:访问相对于 ServletContext 路径里的资源的实现类.
    • InputStreamResource:访问输入流资源的实现类。
    • ByteArrayResource:访问字节数组资源的实现类。
  • 这些 Resource 实现类,针对不同的的底层资源,提供了相应的资源访问逻辑,并提供便捷的包装,以利于客户端程序的资源访问

2) ThreadPoolExecutor

  • 在源码中有 RejectedExecutionHandler 这个抽象异常策略接口也有四种拒绝策略
上次编辑于: 2022/6/20 下午8:24:47
贡献者: liuxianzhishou