• java基础巩固-宇宙第一AiYWM:为了维持生计,策略模式阅读总结~整起


    • 之前碰到一个需求,就是根据系统不同的下位机分布位置,用户可以通过页面的导出功能导出各个地区不同类型的数据,并以excel表格形式导出。
      在这里插入图片描述
      • 这个后端代码中除了必须的通过POI或者easy Excel等技术处理表格形式、以及必要的IO流导出数据代码以及编码格式等,避免不了的就得进行各个重复性的(当时项目中是以地区名称+设备所在位置+时间为导出表名称)表头信息的判断,然后进行一定的处理,伪代码如下:
        if(nameOfExcel == "A"){
        	//按照A方案或者逻辑进行处理
        }else if(){
        	//按照B方案或者逻辑进行处理
        }else{
        	//按照C方案或者逻辑进行处理
        }
        ...
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
      • 很明显,这样写完,功能呢是能实现,但是有几个问题【违背了面向对象编程的开闭原则以及单一原则】:
        • 如果分支变多,这里的代码就会变得臃肿,难以维护,可读性低
        • 如果你需要接入一种新的解析类型,那只能在原有代码上修改
          • 开闭原则(对于扩展是开放的,但是对于修改是封闭的):增加或者删除某个逻辑,都需要修改到原来代码
          • 单一原则(规定一个类应该只有一个发生变化的原因):修改任何类型的分支逻辑代码,都需要改动当前类的代码。
      • 所以,针对咱们这种有多个if…else等条件分支,并且 每个条件分支,可以封装起来替换的【或者switch…case…case…case…几十几百几千个case】,我们就可以使用策略模式来优化
    • 策略模式:
      • 策略模式定义了算法族,分别封装起来【将每一个算法封装到具有共同接口的独立的类中】,让它们之间可以相互替换,此模式让 算法的变化独立于使用算法的的客户,咱们中国最著名的策略模式的使用就是:在目的为把事办好的情况下:对症下药、量体裁衣、具体问题具体分析
      • 咱们用这个策略模式的话首先得搞 一个接口或者抽象类,里面两个方法(一个方法匹配类型,一个可替换的逻辑实现方法)
        public interface DemoByHuFileStrategy{
        	//属于哪种文件解析类型
        	FileTypeResolveEnum gainFileType();
        	
        	//封装的公用算法或者叫具体的解析算法
        	void resolve(Object objectparam);
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      • 然后再搞出 很多个不同策略的实现类,就可以愉快的玩耍了
        //按照A方案或者逻辑进行处理
        @Component
        public class AFileResolve implements DemoByHuFileStrategy{
            
            @Override
            public FileTypeResolveEnum gainFileType() {
                return FileTypeResolveEnum.File_A_RESOLVE;
            }
        
            @Override
            public void resolve(Object objectparam) {
              logger.info("按照A方案或者逻辑进行处理解析文件,参数:{}",objectparam);
              ...
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        //按照B方案或者逻辑进行处理
        @Component
        public class BFileResolve implements DemoByHuFileStrategy{
            
            @Override
            public FileTypeResolveEnum gainFileType() {
                return FileTypeResolveEnum.File_B_RESOLVE;
            }
        
            @Override
            public void resolve(Object objectparam) {
              logger.info("按照B方案或者逻辑进行处理解析文件,参数:{}",objectparam);
              ...
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        //按照C方案或者逻辑进行处理
        @Component
        public class CFileResolve implements DemoByHuFileStrategy{
            
            @Override
            public FileTypeResolveEnum gainFileType() {
                return FileTypeResolveEnum.File_C_RESOLVE;
            }
        
            @Override
            public void resolve(Object objectparam) {
              logger.info("按照C方案或者逻辑进行处理解析文件,参数:{}",objectparam);
              ...
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
      • 玩耍时咱们可以引入比较牛B的Spring,咱们 借助spring的生命周期,使用ApplicationContextAware接口,把对应的策略,初始化到map里面。然后对外提供resolveFile方法即可。
        @Component
        public class StrategyUseService implements ApplicationContextAware{
        
          
            private Map<FileTypeResolveEnum, IFileStrategy> iFileStrategyMap = new ConcurrentHashMap<>();
        
            public void resolveFile(FileTypeResolveEnum fileTypeResolveEnum, Object objectParam) {
                IFileStrategy iFileStrategy = iFileStrategyMap.get(fileTypeResolveEnum);
                if (iFileStrategy != null) {
                    iFileStrategy.resolve(objectParam);
                }
            }
        
            //把不同策略放到map
            @Override
            public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
                Map<String, IFileStrategy> tmepMap = applicationContext.getBeansOfType(IFileStrategy.class);
                tmepMap.values().forEach(strategyService -> iFileStrategyMap.put(strategyService.gainFileType(), strategyService));
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20

    巨人的肩膀:
    设计模式之禅
    Head First 设计模式
    spring揭秘
    JavaGuide
    “程序员田螺 - 设计模式”

  • 相关阅读:
    python基于协同过滤推荐算法的电影观后感推荐管理系统的设计
    一文搞定,JMeter的三种参数化方式
    探索机器学习——构建简单的线性回归模型
    字符串匹配算法(C/Java实现)
    vue3新语法糖<script setup>
    “数智芯生,云端共创”,利尔达精彩亮相第十八届国际物联网展
    shell中的流程控制
    uni-app项目自动化测试
    扬帆志远:shopee产品上传不了的原因
    45、Collections工具类
  • 原文地址:https://blog.csdn.net/m0_52436398/article/details/126157475