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

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

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值