自定义注解

OrderSource

/**
 * 自定义注解
 *  @author: hanleng
 *  @date: 2023/10/8 9:53
 * */
@Inherited // 允许子类继承父类中的注解
@Documented // 将注解包含在Javadoc中
@Target(value = ElementType.TYPE) // 注解可以用于什么地方
@Retention(value = RetentionPolicy.RUNTIME) // 表示需要在什么级别保存该注解信息
@Service // 不加这个service 无法注入各处理类 OrderContext上下文初始化会失败
public @interface OrderSource {
    String source();
}

策略抽象类

OrderStrategy

package com.nasc.base.component.ota.strategy;

/**
 * 策略抽象类
 * 各策略类需要实现此接口
 * @author: hanleng
 * @date: 2023/10/8 9:53
 * */
public interface OrderStrategy<T> {
    // 同步模块公有方法
    void test1(T t); // 无返回值
    <R> R test2(T t);// 有返回值

    // 默认方法,重不重写都可以
    default void default1(T t) {};// 无返回值
    default <R> R default2 (T t) {return null;} // 有返回值
}

上下文类/环境类

OrderContext

package com.nasc.base.component.ota.strategy.context;

import com.nasc.base.component.ota.strategy.OrderSource;
import com.nasc.base.component.ota.strategy.OrderStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 上下文类/环境类
 * 负责和具体的策略类交互
 * 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。
 *
 * 另外使用了工厂方法模式思想,不用知道策略类如何具体实现过程,通过OrderSource 可以直接获得想要的策略类对象
 * @author: hanleng
 * @date: 2023/10/8 9:53
 **/
@Component(value = "OrderContext")
public class OrderContext {

    public static Map<String, OrderStrategy> orderStrategyMap;

    @Autowired
    private void setOrderStrategyMap(List<OrderStrategy> orderStrategies) {
        // 注入各种类型的订单处理类
        orderStrategyMap = orderStrategies.stream().collect(
                Collectors.toMap(orderStrategy -> AnnotationUtils.findAnnotation(orderStrategy.getClass(), OrderSource.class).source(),
                        v -> v, (v1, v2) -> v1));
    }

    // 获取具体策略类
    public static OrderStrategy getStrategy(String orderSource) {
        if (null == orderStrategyMap || null == orderStrategyMap.get(orderSource)) {
            throw new NullPointerException("未获取到策略类,请检查:" + orderSource + "策略类是否存在");
        }
        return orderStrategyMap.get(orderSource);
    }
}

具体策略类

TestStrategy

package com.nasc.base.component.ota.strategy.order;

import com.nasc.base.component.ota.strategy.OrderSource;
import com.nasc.base.component.ota.strategy.OrderStrategy;
import com.nasc.base.entity.ota.util.RequestMethodData;

/**
 * @author: hanleng
 * @date: 2023/9/28 15:26
 **/
@OrderSource(source = "test")
public class TestStrategy implements OrderStrategy<RequestMethodData> {

    @Override
    public synchronized void test1(RequestMethodData requestMethodData) {

    }

    @Override
    public <R> R test2(RequestMethodData requestMethodData) {
        return null;
    }
}

实战操作

OrderContext.getStrategy("test").test1(null);