策略模式demo

使用注解+策略模式 来处理不同业务逻辑

以往,碰到不同的业务处理,会使用if-else,switch等逻辑判断。但是当种类多后,或者业务逻辑复杂等,会造成代码冗余等问题。

使用注解+策略模式 让代码变得更优雅吧

1、首先定义一个注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface OrderStatusTag {
    public String value() default "";
}

用于标识到底是哪个实现类去处理实际业务逻辑

2、定义一个接口,即搭一个处理业务的框架

public interface OrderHandleService {
    void handleOrder(String orderStatus);
}

3、写多种具体的不同业务实现类(记得要标识我们的注解OrderStatusTag )

@OrderStatusTag("cancel")
@Service
public class CancelOrderHandleServiceImpl implements OrderHandleService {
    @Override
    public void handleOrder(String orderStatus) {
        System.out.println("订单状态为:"+orderStatus);
        System.out.println("进行退款操作。。。");
    }
}
@OrderStatusTag("change")
@Service
public class ChangeNotifyOrderHandleServiceImpl implements OrderHandleService {
    @Override
    public void handleOrder(String orderStatus) {
        System.out.println("订单状态为:"+orderStatus);
        System.out.println("进行改签操作。。。");
    }
}
@OrderStatusTag("nonSupport")
@Service
public class NonSupportOrderHandleServiceImpl implements OrderHandleService {

    @Override
    public void handleOrder(String orderStatus) {
        System.out.println("订单状态为:"+orderStatus);
        System.out.println("不支持订单");
    }
}

4、定义一个上下文,即用于判断和选择一个合适的实现类(第3步里面的所有)

public interface ContextService {
    OrderHandleService getOrderHandleService(String status);
}

5、实现上下文

@Service
public class ContextServiceImpl implements ContextService {
    @Autowired
    private List<OrderHandleService> handleServices;
    @Autowired
    private NonSupportOrderHandleServiceImpl nonSupportHandle;

    @Override
    public OrderHandleService getOrderHandleService(String status) {
        if (StringUtils.isEmpty(status)) {
            return nonSupportHandle;
        }
        OrderHandleService service = handleServices.stream().filter(f -> StringUtils.equals(status, f.getClass()
                .getAnnotation(OrderStatusTag.class).value())).findFirst().orElse(nonSupportHandle);
        return service;
    }
}

6、入口测试类

@Service("local-regorder-mytest")
public class MytestImpl implements LocalDataService {
    @Autowired
    private ContextServiceImpl contextService;
    @Override
    public DataTemplate localData(String paramJson) {
        OrderInfo order = new OrderInfo();
        order.setName("用户姓名");
        order.setOrderPrice("100");
        order.setOrderStatus("cancel");
        contextService.getOrderHandleService(order.getOrderStatus()).handleOrder(order.getOrderStatus());
        return null;
    }
}

效果:
在这里插入图片描述

参考:https://blog.csdn.net/u010739551/article/details/103685130

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值