前言
- 策略模式是为了减少主业务逻辑
else if
的代码量。 - 当我们用策略模式的时候,要把
else if
的关系用另一种方式体现出来,以后如果要增加else if
的关系,只需要增加策略模式的对应关系
就可以。 - 优点: 可以减少主业务逻辑的代码量,便于维护
一、接口方式
1.1 接口定义
1 | java复制代码public interface Adapter { |
1.2 实现类继承接口并实现方法
1 | java复制代码/** |
1.3 找到不同实现类之间的对应关系
接口模式的对应关系,我一般会用HashMap
。这样处理数据时,把数据else if
的条件作为key,实现类.class
作为value,维护一个HashMap。调用时,不同的数据就可以找到对应的实现类
1.3.1 首先维护一个枚举
else if
的关系可以存入到枚举里,便于维护
1 | java复制代码@Getter |
1.3.2 维护HashMap
1 | java复制代码public class ActExecutor { |
1.4 业务层调用
数据
1 | java复制代码public class People { |
调用
1 | java复制代码// data可以理解为业务层拿到的数据 |
1.5 总结
定义一个通用的接口和继承该接口的不同实现类,用枚举
和HashMap
维护else if
的对应关系。业务代码就可以根据数据去HashMap中找到实现类并执行。
上述的基于接口和实现类
的策略模式有点时候会有点儿笨重。比如上述的接口有两个方法,但是有几种情况只需要执行一种方法,或者还有几种情况要执行超过两个方法,那这样情况多了之后,定义接口时就要充分考虑到不同业务的兼容,这样的策略模式实现必须要充分的对业务进行抽象。
二、枚举直接实现
当时为了解决上述的问题,我看了《Effective Java》中对于枚举的用法。自己设计了一个一个策略就是一个方法的模式。
2.1 枚举
1 | java复制代码@Getter |
spring上下文工具
1 | java复制代码/** |
2.2 方法调用
1 | java复制代码// data可以理解为业务层拿到的数据 |
2.3 总结
这样可以一个方法一个策略,就是枚举里重写的每个方法都需要引入spring的上下文,也就是说要确保枚举方法的调用一定要在spring上下文的加载完成后才行,否则会报Bean找不到的错误。
本文转载自: 掘金