策略模式---依订单来源,支付方式调用不同逻辑

该博客介绍了一个基于注解的订单处理系统设计。通过创建不同的订单处理接口实现类,如MobileAliOrderHandler和PCWXOrderHandler,系统可以根据订单来源(source)和支付方式(payMethod)来选择合适的处理策略。OrderHandlerType自定义注解用于标记处理类,并在OrderServiceImpl中通过映射处理类和注解信息,实现动态调用相应处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 订单实体类
@Data
public class MyOrder {

    /**
     * 订单来源
     */
    private String source;
    /**
     * 支付方式
     */
    private String payMethod;
    /**
     * 订单编号
     */
    private String code;
}
  1. 订单处理接口
public interface OrderHandler {

    void handle(MyOrder order);
}
  1. 订单处理不同实现类
@OrderHandlerType(source = "mobile",payMethod = "ali")
public class MobileAliOrderHandler implements OrderHandler{
    @Override
    public void handle(MyOrder order) {
        System.out.println("处理移动端订单,阿里支付");
    }
}
@OrderHandlerType(source = "mobile",payMethod = "wx")
public class MobileWXOrderHandler implements OrderHandler{

    @Override
    public void handle(MyOrder order) {
        System.out.println("处理移动端订单,微信支付");
    }
}
@OrderHandlerType(source = "pc",payMethod = "ali")
public class PCAliOrderHandler implements OrderHandler{

    @Override
    public void handle(MyOrder order) {
        System.out.println("处理PC端订单,阿里支付");
    }
}
@OrderHandlerType(source = "pc",payMethod = "wx")
public class PCWXOrderHandler implements OrderHandler{

    @Override
    public void handle(MyOrder order) {
        System.out.println("处理PC端订单,微信支付");
    }
}
  1. 自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface OrderHandlerType {

    String source();

    String payMethod();
}
  1. 注解也是个接口,来一个实现类(一定要重写hashCode和equals方法)
public class OrderHandlerTypeImpl implements OrderHandlerType{

    private String source;
    private String payMethod;

    OrderHandlerTypeImpl(String source, String payMethod) {
        this.source = source;
        this.payMethod = payMethod;
    }

    @Override
    public String source() {
        return source;
    }

    @Override
    public String payMethod() {
        return payMethod;
    }

    @Override
    public Class<? extends Annotation> annotationType() {
        return OrderHandlerType.class;
    }

    @Override
    public int hashCode() {
        int hashCode = 0;
        hashCode += (127 * "source".hashCode()) ^ source.hashCode();
        hashCode += (127 * "payMethod".hashCode()) ^ payMethod.hashCode();
        return hashCode;
    }


    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof OrderHandlerType)) {
            return false;
        }
        OrderHandlerType other = (OrderHandlerType) obj;
        return source.equals(other.source()) && payMethod.equals(other.payMethod());
    }
}
  1. 接下来就是业务代码:Controller->Service->ServiceImpl,重点是ServiceImpl
@Service
public class OrderServiceImpl {

    private Map<OrderHandlerType, OrderHandler> orderHandleMap;

    @Autowired
    public void setOrderHandleMap(List<OrderHandler> orderHandlers) {
        // 注入各种类型的订单处理类
        orderHandleMap = orderHandlers.stream().collect(
                Collectors.toMap(orderHandler -> AnnotationUtils.findAnnotation(orderHandler.getClass(), OrderHandlerType.class),
                        v -> v, (v1, v2) -> v1));
                /*   Collectors.toMap(orderHandler -> AnnotationUtils.findAnnotation(orderHandler.getClass(), OrderHandlerType.class),
                          v -> v));*/

    }

    public void orderService(MyOrder order) {
        OrderHandlerType orderHandlerType = new OrderHandlerTypeImpl(order.getSource(), order.getPayMethod());
        OrderHandler orderHandler = orderHandleMap.get(orderHandlerType);
        orderHandler.handle(order);
    }
}
  1. 调用orderService()即可

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值