设计模式-策略模式(注解形式)
精选
原创
©著作权归作者所有:来自51CTO博客作者你的阿冷丶的原创作品,请联系作者获取转载授权,否则将追究法律责任
自定义注解
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);