1.自定义注解,通过参数值定位实际要走的策略类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FinishStrategyType {
String templetes();
}
2.创建策略类接口,通过多态调用的方式实现策略类模式
public interface FinishStrategy {
Map<String, Object> execute();
}
3.创建策略类
/**
* templetes 可以设置逗号隔开的参数值,满足多条件判断 “1,2”
*/
@Component
@FinishStrategyType(templetes = '1,2')
@Transactional
public class EatFinishStrategy implements FinishStrategy {
/**
* 执行
*/
@Override
public void execute() {
System.out.println("参数值1或者2执行这里");
}
}
@Component
@FinishStrategyType(templetes = '3')
@Transactional
public class SleepFinishStrategy implements FinishStrategy {
/**
* 执行
*/
@Override
public void execute() {
System.out.println("参数值3执行这里");
}
}
4 调用策略模式执行具体的方法
/**
* 实际执行的策略类集合
* 这里通过注解的方式注入,也可以通过其他方式注入
*/
@Autowired
private Map<String, FinishStrategy> strategyMap;
/**
* 根据自定义注解参数值重新封装策略类集合,参数值作为key
*
* @param finishStrategys
*/
@Autowired
public void setStrategyMap(List<FinishStrategy> finishStrategys) {
strategyMap = finishStrategys.stream().collect(
Collectors.toMap(t -> AnnotationUtils.findAnnotation(t.getClass(), FinishStrategyType.class).templetes(),
v -> v, (v1, v2) -> v1));
}
/**
* 策略模式调用执行
*
* @param type 定位需要执行的策略类参数,值:“1”、“2”、"3"
*/
public void running(String type) {
//得到实际执行的策略类
for (Map.Entry<String, FinishStrategy> entry : strategyMap.entrySet()) {
// entry.getKey() 是策略类自定义注解的参数值,根据参数值得到实际执行的策略类
String keys = entry.getKey();
List<String> list = Arrays.asList(keys.split(","));
if (list.contains(type)) {
FinishStrategy finishStrategy = strategyMap.get(keys);
finishStrategy.execute();
}
}
}