策略模式的定义
策略模式是一种行为型模式,它定义了一系列算法,并将每个算法封装起来,使他们可以相互替换。在实际的使用中,可以在运行时根据实际情况选择不同的策略。
策略模式有这些优点:
- 避免使用多重条件语句。
- 策略模式可以把一些重复的算法写到父类中,由继承这个父类的子类去调用,避免了重复的代码。
策略模式的缺点:由于每一个策略的实现都需要新增一个策略类,所以可能会造成出现很多的策略类。
模式的结构
策略模式主要有以下这几种结构:
- 抽象策略类:定义了一个公共接口,接口定义了策略方法交给子类去实现。抽象策略类一般是接口或者抽象类。
- 具体策略:是对抽象策略类的实现,对抽象策略类的不同方法提供具体的实现。
- 上下文类(Context):包含了对策略对象的引用,交给我们去调用。
模式的类图
模式的实现
在平常的Java项目开发中,我们都是依赖于Spring或者SpringBoot的,为了便于理解,以及更加贴近我们的日常开发,下面的实现将采用Spring的BeanFactory来作为我们的上下文类,也就是我们把具体的策略都交给Spring容器去管理。
抽象策略类
1 2 3
| public interface StrategyService { void strategyMethod(); }
|
具体策略
具体策略类1
1 2 3 4 5 6 7
| @Service("strategy1Service") public class Strategy1ServiceImpl implement StrategyService { @Override public void strategyMethod() { System.out.println("这里是具体策略类:1"); } }
|
具体策略类2
1 2 3 4 5 6 7
| @Service("strategy2Service") public class Strategy2ServiceImpl implement StrategyService { @Override public void strategyMethod() { System.out.println("这里是具体策略类:2"); } }
|
策略的使用
上面省略了上下文类,是因为我们在每个具体策略类中通过Spring的@Service注解,将他们交给Spring容器管理,由Spring帮我们创建具体策略类了。下面是对这些策略的使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Component public class SrtategyExecutor { @Resource("strategy1Service") private StrategyService strategy1Service; @Resource("strategy1Service") private StrategyService strategy2Service; public void srtategyExecutor() { strategy1Service.strategyMethod(); strategy2Service.strategyMethod(); } }
|