zoukankan      html  css  js  c++  java
  • 策略模式--实战1

    需求说明

    WKD项目中导出使用到了策略模式,需要根据id导出不同订单的明细数据,其中订单类型有四种(直营返货调拨单/申请单,加盟返货调拨单/申请单),使用策略模式避免使用多重条件判断(if,else),美化代码的同时增加了扩展性。

    策略接口

    public interface IExportStrategy {
    
        /**
         * 根据id导出相应订单类型(直营返货申请单/调拨单,加盟返货申请单/调拨单,共四种类型,用ABCD表示)的数据
         * @param id
         * @return
         */
        List makeExportData(Long id);
    }

    实现了策略接口的实体策略类

    public class AExportStrategyImpl implements IExportStrategy {
             
            @Override
            public List makeExportData(Long id) {
    
            //根据id查询数据
            xxx queryList = xxxServer.queryById(id)
            //最终需要导出的excel数据
            List excelList = new ArrayList();
            ......
            //对查询出来的数据queryList做业务处理后,赋值到excelList 
            ......
         
            return excelList;
        }
    }        

    说明还有类似的B,C,D三个实体策略类,类似AExportStrategyImpl,只是makeExportDate(Long id)中的实现不同.

    策略工厂

    /**
     * 生产具体策略工厂
     * @author 佛大java程序员
     * @create 2020/5/6
     * @since 1.0.0
     */
    public class StrategyFactory {
    
        public static IExportStrategy getStrategy(String type){
            IExportStrategy strategy = null;
            try {
        //根据订单的类型(A,B,C,D),找到类型Type对应枚举类的策略实现类的类全名,再通过反射获得具体策略类实现类对象实例
                strategy = (IExportStrategy) Class.forName(ExportStrategyClazzEnums.getDesc(type)).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
    
                System.out.println("生成策略出错");
            }
            return strategy;
        }
    }

    策略实现类枚举

    /**
     * 具体策略实现类枚举
     * @author 佛大Java程序员
     * @create 2020/05/6
     * @since 1.0.0
     */
    public enum ExportStrategyClazzEnums {
        /**
         * 申请单直营返货
         */
        APPLY_DIRECT_RETURN("A","com.whl.impl.AExportStrategyImpl"),
    
        /**
         * 调拨单直营返货
         */
        ORDER_DIRECT_RETURN("B","com.whl.impl.BExportStrategyImpl"),
    
        /**
         * 申请单加盟返货
         */
        APPLY_FRANCHISEE_RETURN("C","com.whl.impl.CExportStrategyImpl"),
    
        /**
         * 调拨单直营返货
         */
        ORDER_FRANCHISEE_RETURN("D","com.whl.impl.DExportStrategyImpl");
    
        /**
         * 调拨申请状态
         */
        private String type;
    
        /**
         * 调拨申请状态说明
         */
        private String desc;
        
        public static String getDesc(String type) {
            for (ExportStrategyClazzEnums clazzEnum : ExportStrategyClazzEnums.values()) {
                if (clazzEnum.getType().equals(type)) {
                    return clazzEnum.getDesc();
                }
            }
            return null;
        }
    
        ExportStrategyClazzEnums(String type, String desc) {
            this.type = type;
            this.desc = desc;
        }
    
        /**
         * 获取类型
         *
         * @return
         */
        public String getType() {
            return type;
        }
    
        /**
         * 设置类型
         *
         * @param type
         */
        public void setType(String type) {
            this.type = type;
        }
    
        /**
         * 获取类型说明
         *
         * @return
         */
        public String getDesc() {
            return desc;
        }
    
        /**
         * 设置类型说明
         *
         * @param desc
         */
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
    }

    实现类

    /**
     * @author 佛大Java程序员
     * @create 2020/05/6
     * @since 1.0.0
     */
    @Service
    public class ExportServiceImpl implements IExportService {
    
      /**
         * 导出申明明细列表到OSS上
         * @param threadId
         * @return
         */
        @Override
        public String exportApplyList(Long threadId,ExportReqDto reqDto){
            long t1 = System.currentTimeMillis();
    
            //直营_调配补返_状态
            String type = "APPLY_"+reqDto.getManageType()+"_"+reqDto.getTransferType();
         //根据订单类型获取到具体的策略实现类 IExportStrategy strategy
    = StrategyFactory.getStrategy(type);
         //调用接口方法 List excelList
    = strategy.makeExportData(reqDto.getId()); String fileName = "申请明细列表_"+threadId+".xls"; return exportExcelToOss(t1,fileName,excelList,null); } }

    参考/好文:

    菜鸟教程 --

    https://www.runoob.com/design-pattern/strategy-pattern.html

  • 相关阅读:
    Javascript事件处理程序的3种方式
    JS原生AJAX
    所谓的渐进增强,优雅降级?
    1059 老师的苦恼
    HTML5 参数传递
    HDU 5289 Assignment(二分+RMQ-ST)
    HDU 3333 Turing Tree(离线树状数组)
    mac下 mysql 插入中文乱码解决
    校园商铺-7商品类别模块-5商品类别删除后端开发
    校园商铺-7商品类别模块-3商品类别添加后端开发
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12834308.html
Copyright © 2011-2022 走看看