0
点赞
收藏
分享

微信扫一扫

利用自定义注解+Map+反射实现策略模式

快乐与微笑的淘气 2022-04-13 阅读 108
java

场景: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.使用阿里支付

 

举报

相关推荐

0 条评论