策略模式最大的优点是可以干掉大量的if-else,使代码更简洁明了
/**
* 基于注解的策略模式的核心类
* 优点:可以干掉大量if-else
*
* @author nanfengxiangbei
* @date 2020/8/7 13:55
*/
@Service
public class OrderHandleContext {
private Map<String, OrderHandler> orderHandleMap;
@Autowired
public void setOrderHandleMap(List<OrderHandler> orderHandlers) {
// 注入各种类型的订单处理类
orderHandleMap = orderHandlers.stream().collect(
Collectors.toMap(orderHandler -> AnnotationUtils.findAnnotation(orderHandler.getClass(), OrderHandlerType.class).source(),
v -> v, (v1, v2) -> v1));
}
public void orderService(String type, AddedSyncInfoBO syncInfo) throws Exception {
// ...一些前置处理
// 通过订单来源确定对应的handler
OrderHandler orderHandler = orderHandleMap.get(type);
// ...一些后置处理
orderHandler.handle(syncInfo);
}
}
/**
* 基于注解
*
* @author nanfengxiangbei
* @date 2021/03/18 13:49
*/
public interface OrderHandler {
/**
* 业务处理的公用方法
*
* @param syncInfo 消息体
*/
void handle(AddedSyncInfoBO syncInfo) throws Exception;
}
/**
* @author nanfengxiangbei
* @date 2020/8/7 13:50
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface OrderHandlerType {
String source();
}
/**
* OperationTypeConstant.ADDED_BIZ_CANCEL 操作代码
*
* @author nanfengxiangbei
* @date 2021/03/18 13:53
*/
@OrderHandlerType(source = OperationTypeConstant.ADDED_BIZ_CANCEL)
public class CancelHandler implements OrderHandler {
private final Logger logger = LoggerFactory.getLogger(CancelHandler.class);
@Override
public void handle(AddedSyncInfoBO syncInfo, ServiceProduct product, UserInfoBO userInfoBO) {
// 业务处理
dealClose(syncInfo);
}
}