策略模式

有多个 if...else 等条件分支,并且每个条件分支,可以封装起来替换的,可以使用策略模式来优化

  1. 一个接口
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface IFileStrategy {
/**
* 输入哪种文件类型
* @return
*/
FileTypeEnum getFileType();

/**
* 具体解析方法
* @param param
*/
void resolve(Object param);
}
JAVA
  1. 一个枚举,及实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public enum FileTypeEnum {
A,
B,
C;
}

@Component
public class AFileResolve implements IFileStrategy {
private static final Logger log = LoggerFactory.getLogger(AFileResolve.class);

@Override
public FileTypeEnum getFileType() {
return FileTypeEnum.A;
}

@Override
public void resolve(Object param) {
log.info("A 类型解析文件,参数:{}", param);
// A 类型解析
}
}

@Component
public class BFileResolve implements IFileStrategy {
private static final Logger log = LoggerFactory.getLogger(BFileResolve.class);

@Override
public FileTypeEnum getFileType() {
return FileTypeEnum.B;
}

@Override
public void resolve(Object param) {
log.info("B 类型解析文件,参数:{}", param);
// B 类型解析
}
}
JAVA
  1. ApplicationContextAware 接口,把策略初始化到 map 里面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Component
public class StrategyUseService implements ApplicationContextAware {
private Map<FileTypeEnum, IFileStrategy> iFileStrategyMap = new HashMap<>();

public void resolveFile(FileTypeEnum fileTypeEnum, Object param){
IFileStrategy iFileStrategy = iFileStrategyMap.get(fileTypeEnum);
if (iFileStrategy != null) {
iFileStrategy.resolve(param);
}
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, IFileStrategy> tempMap = applicationContext.getBeansOfType(IFileStrategy.class);
tempMap.values().forEach(strategyService -> iFileStrategyMap.put(strategyService.getFileType(), strategyService));
}
}
JAVA

策略模式
http://showyoubug.cn/2024/06/24/策略模式/
作者
Dong Su
发布于
2024年6月24日
许可协议