场景:TODO
思路:
1.扫描所有有自定义注解的类通过反射put到map中(初始化类似与IOC启动流程)
2.根据不同策略从map中获取对应的处理类处理业务
代码实现:
1.自定义注解
/**
* 标记类需要put到策略map中
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PutInMap {
// 策略模式名称
String value() default "";
}
2.决策类
public class StrategyContext02 {
// 策略Map
public static final ConcurrentHashMap<String,IPayStrategy02> strategyMap = new ConcurrentHashMap<>();
// 扫描包路径
private static final String PACKAGE_NAME = "cn.zk.strategy02";
/**
* 根据支付方式进行支付
* @param payMode
* @return
*/
public boolean pay(String payMode) {
IPayStrategy02 strategy02 = strategyMap.get(payMode);
return Objects.isNull(strategy02) ? false : strategy02.pay();
}
/**
* 初始化map
*/
public void initStrategyMap() {
Reflections reflections = new Reflections(PACKAGE_NAME);
// 获取所有包含PutInMap注解的类
Set<Class<?>> annotationClasses = reflections.getTypesAnnotatedWith(PutInMap.class);
for (Class<?> classObject: annotationClasses) {
// 将PutInMap的value作为key,IPayStrategy02实现类未value放入map中
PutInMap annotation = classObject.getAnnotation(PutInMap.class);
IPayStrategy02 instance = null;
try {
instance = (IPayStrategy02)classObject.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
strategyMap.put(annotation.value(),instance);
System.out.println("策略Map加入元素"+annotation.value()+"....");
}
System.out.println("策略Map初始化完成");
}
/**
* 清理map
*/
public void clearMap() {
strategyMap.clear();
}
}
3.策略接口
/**
* 支付策略接口
*/
public interface IPayStrategy02 {
boolean pay();
}
4.具体实现类
4.1微信支付
/**
* WxPay
*/
@PutInMap("WxPay")
public class WxPayStrategyImpl implements IPayStrategy02 {
@Override
public boolean pay() {
System.out.println("支付=====>WxPay");
return true;
}
}
4.1阿里支付
/**
* AliPa
*/
@PutInMap("AliPa")
public class AliPayStrategyImpl implements IPayStrategy02 {
@Override
public boolean pay() {
System.out.println("支付=====>AliPa");
return true;
}
}
测试
1.使用微信支付
2.使用阿里支付