这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
概述
策略模式(Strategy Pattern)是通过一些独立的类来封装一系列算法,并且它们之间可以相互转换。每一个算法称为一种策略或政策,因此又称为政策模式(Policy Pattern),是一种对象行为型模式。
策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为和环境分开,为了保证这些策略在使用时具有一致性,一般会提供一个抽象的策略类来做规则的定义,而每种算法则对应于一个具体策略类,使用算法的环境类是针对抽象策略类进行编程的。
结构
- Context(环境类):是使用算法的角色,维持了抽象策略类的引用。
- Strategy(抽象策略类):声明了所有具体策略类的公共方法,一般是抽象类或接口,但也可以是具体类。
- ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的算法。
优点
- 将策略的定义与使用分开,有利于关注点的分离。
- 避免了使用多重条件判断,有利于系统的维护。
- 新增策略不必修改环境类,符合开闭原则。
- 策略模式的环境类通过聚合使用策略,减少了继承的使用。
- 抽象策略类提供了算法复用的机制,避免了重复的代码。
缺点
- 当策略过多时,会造成类的膨胀。
- 所有的策略类都需要对外暴露,不符合迪米特法则。
- 在客户端中无法组合使用多个策略类。
应用场景
- 系统需要动态地在几种算法中选择一种。
- 系统需要屏蔽算法的具体规则。
- 多个类只有在算法或行为上稍有不同的场景,通过策略模式可以避免使用难以维护的多重条件选择语句。
JDK 中的应用
在 JDK 中 java.util.Comparator
就使用了策略模式。
java.util.Comparator 就是抽象策略类:
1 | java复制代码@FunctionalInterface |
java.util.Arrays 是环境类:
1 | java复制代码public class Arrays { |
本文转载自: 掘金