zoukankan      html  css  js  c++  java
  • 开发业务逻辑处理之策略模式场景使用

    代码如下:

    1.TestItemBizService 和 TestOrderBizService 这两个类是真实业务逻辑处理

    /**
     *
     * @Author:xuliangliang
     * @Description:模拟订单业务逻辑处理
     * @Date 2020/8/28
     */
    @Service
    public class TestOrderBizService {
    
        /**
         * 业务逻辑1
         * @param order
         * @return
         */
        public ResultResponse bizOne(OrderPO order) {
            //业务逻辑处理
            ResultResponse<OrderPO> resultEntity = new ResultResponse(order.getId()+"业务逻辑1");
            resultEntity.setIsSuccess(Boolean.TRUE);
            resultEntity.setErrorCode("200");
            resultEntity.setData(order);
            return resultEntity;
        }
    
        /**
         * 业务逻辑2
         * @param order
         * @return
         */
        public ResultResponse bizTwo(OrderPO order) {
            ResultResponse<OrderPO> resultEntity = new ResultResponse(order.getId()+"业务逻辑2");
            resultEntity.setIsSuccess(Boolean.TRUE);
            resultEntity.setErrorCode("200");
            resultEntity.setData(order);
            return resultEntity;
        }
    
        /**
         * 业务逻辑3
         * @param order
         * @return
         */
        public ResultResponse bizThree(OrderPO order) {
            ResultResponse<OrderPO> resultEntity = new ResultResponse(order.getId()+"业务逻辑3");
            resultEntity.setIsSuccess(Boolean.TRUE);
            resultEntity.setErrorCode("200");
            resultEntity.setData(order);
            return resultEntity;
        }
    }
    /**
     *
     * @Author:xuliangliang
     * @Description:模拟商品业务逻辑处理单元
     * @Date 2020/8/28
     */
    @Service
    public class TestItemBizService {
    
        /**
         * 业务逻辑1
         * @param item
         * @return
         */
        public ResultResponse bizOne(ItemPO item) {
            //业务逻辑处理
            ResultResponse<ItemPO> resultEntity = new ResultResponse(item.getId()+"业务逻辑1");
            resultEntity.setIsSuccess(Boolean.TRUE);
            resultEntity.setErrorCode("200");
            resultEntity.setData(item);
            return resultEntity;
        }
    
        /**
         * 业务逻辑2
         * @param item
         * @return
         */
        public ResultResponse bizTwo(ItemPO item) {
            ResultResponse<ItemPO> resultEntity = new ResultResponse(item.getId()+"业务逻辑2");
            resultEntity.setIsSuccess(Boolean.TRUE);
            resultEntity.setErrorCode("200");
            resultEntity.setData(item);
            return resultEntity;
        }
    
        /**
         * 业务逻辑3
         * @param item
         * @return
         */
        public ResultResponse bizThree(ItemPO item) {
            ResultResponse<ItemPO> resultEntity = new ResultResponse(item.getId()+"业务逻辑3");
            resultEntity.setIsSuccess(Boolean.TRUE);
            resultEntity.setErrorCode("200");
            resultEntity.setData(item);
            return resultEntity;
        }
    }

    2.ItemBizContext 和 OrderBizContext 这两个类是业务处理上下文,主要作用是为了根据传入参数标识位进行动态选择不通的业务逻辑处理点

    /**
     *
     * @Author:xuLiangLiang
     * @Description:订单上下文
     * @Date 2020/9/9
     */
    @AllArgsConstructor
    @Component
    public class OrderBizContext implements ContextProxyInterface<OrderPO, ResultResponse> {
    
        private final TestOrderBizService testOrderBizService;
        /**
         *存储策略方法 测试订单业务逻辑
         */
        private Map<ServiceFlagEnum, Function<OrderPO, ResultResponse>> checkResultDispatcherOrderComX = new ConcurrentHashMap<>();
    
    
        /**
         * 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
         */
        @PostConstruct
        private void checkResultDispatcherComXInit() {
            //订单业务
            checkResultDispatcherOrderComX.put(ServiceFlagEnum.ORDER_MARK001, order -> testOrderBizService.bizOne(order));
            checkResultDispatcherOrderComX.put(ServiceFlagEnum.ORDER_MARK002, order -> testOrderBizService.bizTwo(order));
            checkResultDispatcherOrderComX.put(ServiceFlagEnum.ORDER_MARK003, order -> testOrderBizService.bizThree(order));
        }
    
        /**
         * 获取策略逻辑
         * @param order
         * @param mark
         * @return
         */
        private ResultResponse getCheckResultOrderComX(OrderPO order, String mark) {
    
            ServiceFlagEnum flagStrategy = ServiceFlagEnum.getFlagStrategy(mark);
            if(flagStrategy == null){
                return new ResultResponse("没有["+mark+"]标识业务");
            }
    
            Function<OrderPO, ResultResponse> result = checkResultDispatcherOrderComX.get(flagStrategy);
            if (result != null) {
                //执行这段表达式获得的结果
                return result.apply(order);
            }
    
            return new ResultResponse("不在处理的逻辑中返回业务错误");
        }
    
        @Override
        public ResultResponse doExecute(OrderPO orderEntity) {
            return getCheckResultOrderComX(orderEntity, orderEntity.getMark());
        }
    }
    /**
     *
     * @Author:xuliangliang
     * @Description:商品上下文
     * @Date 2020/8/28
     */
    @Component
    public class ItemBizContext implements ContextProxyInterface<ItemPO, ResultResponse> {
    
        @Autowired
        private TestItemBizService testItemBizService;
    
        /**
         * 存储策略方法 商品业务逻辑
         */
        private Map<ServiceFlagEnum, ServiceStrategyInterface<ItemPO, ResultResponse>> checkResultDispatcherItemComX = new ConcurrentHashMap<>();
    
        /**
         * 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
         */
        @PostConstruct
        private void checkResultDispatcherComXInit() {
            //商品业务
            checkResultDispatcherItemComX.put(ServiceFlagEnum.ITEM_MARK001, item-> testItemBizService.bizOne(item));
            checkResultDispatcherItemComX.put(ServiceFlagEnum.ITEM_MARK002, item-> testItemBizService.bizTwo(item));
            checkResultDispatcherItemComX.put(ServiceFlagEnum.ITEM_MARK003, item-> testItemBizService.bizThree(item));
        }
    
        /**
         * 获取策略逻辑
         * @param order
         * @param mark
         * @return
         */
        private ResultResponse getCheckResultItemComX(ItemPO order, String mark) {
    
            ServiceStrategyInterface<ItemPO, ResultResponse> result = checkResultDispatcherItemComX.get(ServiceFlagEnum.getFlagStrategy(mark));
            if (result != null) {
                //执行这段表达式获得的结果
                return result.doExecute(order);
            }
    
            return new ResultResponse("不在处理的逻辑中返回业务错误");
        }
    
        @Override
        public ResultResponse doExecute(ItemPO itemEntity) {
            return getCheckResultItemComX(itemEntity, itemEntity.getMark());
        }
    }

    3.ServiceContextProxy这个类的作用是代理多个业务上下文(2),因为实际开发过程中可能会出现不同业务的策略上下文模式

    /**
     *
     * @Author:xuLiangLiang
     * @Description:业务上下文代理
     * @Date 2020/9/9
     */
    @AllArgsConstructor
    @Component
    public class ServiceContextProxy<T>{
    
        private ApplicationContext applicationContext;
        /**
         * 执行业务域
         * @param t
         * @param classBiz
         * @return
         */
        public ResultResponse execute(T t, Class<? extends ContextProxyInterface> classBiz) {
    
            ContextProxyInterface<T, ResultResponse> contextProxyInterface = applicationContext.getBean(classBiz);
    
            return contextProxyInterface.doExecute(t);
        }
    }

    4.TestStrategyBizController 这个类是为了测试,但是也可以是对外开放的Controller或RPC接口

    /**
     *
     * @Author:xuliangliang
     * @Description:测试策略模式
     * @Date 2020/8/28
     */
    @RestController
    public class TestStrategyBizController {
        @Autowired
        private ServiceContextProxy serviceContextProxy;
    
        @PostMapping(value = "/v1/biz/test/order", produces="application/json")
        public ResultResponse orderTest(OrderPO orderEntity) {
            if(StringUtils.isEmpty(orderEntity.getMark())){
                return new ResultResponse("没有Mark标识", false);
            }
            ResultResponse resultEntity = serviceContextProxy.execute(orderEntity, OrderBizContext.class);
            return resultEntity;
        }
    
        @PostMapping(value = "/v1/biz/test/item", produces="application/json")
        public ResultResponse itemTest(ItemPO itemEntity) {
            if(StringUtils.isEmpty(itemEntity.getMark())){
                return new ResultResponse("没有Mark标识", false);
            }
            ResultResponse resultEntity = serviceContextProxy.execute(itemEntity, ItemBizContext.class);
            return resultEntity;
        }
    }

    5.以上代码是策略模式主要核心代码,感兴趣的可以拉代码学习,这也是我在开发过程中根据业务需求进行编写的Demo

  • 相关阅读:
    详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
    使用WorkService创建定时任务
    Mahout下个性化推荐引擎Taste介绍
    Apache Mahout中的机器学习算法集
    内网信息收集笔记 楼下的小可怜
    关于linux的suid提权 楼下的小可怜
    Cobalt Strike初探 楼下的小可怜
    Google hacking 楼下的小可怜
    Git和Repo扫盲——如何取得Android源代码 zt
    Howto find native code memory leak in Android
  • 原文地址:https://www.cnblogs.com/x-ll123/p/13640412.html
Copyright © 2011-2022 走看看