🍄 策略模式
2022年6月20日
- 设计模式
🍄 策略模式
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 这个抽象异常策略接口也有四种拒绝策略