zoukankan      html  css  js  c++  java
  • 【原】基于Spring实现策略模式

    背景:

      看多很多策略模式,总结下来大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案

     

    首先先看下比较常见的策略模式写法

     

    • 一个接口或者抽象类,里面两个方法(一个方法匹配类型,一个可替换的逻辑实现方法)
    • 不同策略的差异化实现(就是说,不同策略的实现类)
    • 使用策略模式

    1.3.1 一个接口,两个方法

    public interface IFileStrategy {
        
        //属于哪种文件解析类型
        FileTypeResolveEnum gainFileType();
        
        //封装的公用算法(具体的解析方法)
        void resolve(Object objectparam);
    }

    1.3.2 不同策略的差异化实现

    A 类型策略具体实现

    @Component
    public class AFileResolve implements IFileStrategy {
        
        @Override
        public FileTypeResolveEnum gainFileType() {
            return FileTypeResolveEnum.File_A_RESOLVE;
        }
    
        @Override
        public void resolve(Object objectparam) {
          logger.info("A 类型解析文件,参数:{}",objectparam);
          //A类型解析具体逻辑
        }
    }

    B 类型策略具体实现

    @Component
    public class BFileResolve implements IFileStrategy {
       
        @Override
        public FileTypeResolveEnum gainFileType() {
            return FileTypeResolveEnum.File_B_RESOLVE;
        }
    
    
        @Override
        public void resolve(Object objectparam) {
          logger.info("B 类型解析文件,参数:{}",objectparam);
          //B类型解析具体逻辑
        }
    }

    默认类型策略具体实现

    @Component
    public class DefaultFileResolve implements IFileStrategy {
    
        @Override
        public FileTypeResolveEnum gainFileType() {
            return FileTypeResolveEnum.File_DEFAULT_RESOLVE;
        }
    
        @Override
        public void resolve(Object objectparam) {
          logger.info("默认类型解析文件,参数:{}",objectparam);
          //默认类型解析具体逻辑
        }
    }

    1.3.3 使用策略模式

    如何使用呢?我们借助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));
        }
    }

    基于Spring服务策略实现

          稍微了解过Spring源码都知道,我们的bean被Spring管理后,当需要调用的时候实际是从工厂里拿到这个bean,所以大致思路就是自定义一个类似Service的注解,在真正调用前去根据方法里面的形参的进行拼接得到实际的bean,然后进行调用

     

  • 相关阅读:
    csu 1513 Kick the ball! 搜索
    训练赛bug总结
    csu 1780 简单的图论问题? 搜索
    贪吃蛇
    hdu 1541 Stars 树状数组
    FZU 2092 收集水晶 BFS记忆化搜索
    [ An Ac a Day ^_^ ] UVALive 2035 The Monocycle BFS
    52. N皇后 II
    修改全局变量-global 修改外部嵌套函数中的变量 nonlocal
    安装glove 不报错
  • 原文地址:https://www.cnblogs.com/zdd-java/p/15746037.html
Copyright © 2011-2022 走看看