• 策略模式1


    知道这个模式很久了,也觉得很有用,但是工作上一直找不到实际应用场景,如果工程量小,根本不值得过度设计。

    这次刚好项目中有一个场景。有点符合使用场景。

    有一个文件解析的功能,一共40多个判断。3000多行代码。其中每一块都有独特的解析逻辑,最多的需要8表连查判断,于是想用策略模式解耦。

    解析的文件以begin XXX/end XXX作为一个解析块。

    if/else判断对应的XXX,并写业务逻辑。

    这里应该要应用工厂+策略来确定用哪个service处理解析逻辑。

    但是springIOC里都已经把实例放进去了。

    所以我的设想是:

    1、一个Map<String, Service>来对应标识和service实例,实现context的功能。

    2、读取到哪个标识,自动调用相应实例的指定方法,来实现自己的逻辑。

    3、这样场景类的代码就很少了,而且增加了扩展性。

    想法很丰满,后期还是碰到很多问题,不过个人认为是值得的,

    6个人一起写一个文件,光处理冲突、定义全局变量,定义返回变量等细碎操作就把人磨死了

    啥也别说,开始实现,先写一个策略接口:

    public interface IStrategy{
        String getType();
    
        Integer doAnalysis(param);
    }

    接口很简单,每个类自己需要返回自己的Type,对应标识字符串,doAnalysis()方法写业务逻辑,返回一个操作数量。

    下来写具体的service:

    @Service
    public class TestService extends BaseService<Test> implements IStrategy{
        private static final String SERVICE_TYPE = "XXX";
        
        @Override
        public String getType() {
            return SERVICE_TYPE;
        }
    
         @Override
        public Integer doAnalysis(param) {
            //do sth;
        }

    下来该场景类去把大家整合起来了:

    //从容器中将继承了接口的实例全拿出来。
    1
    ServletContext sc = ContextLoader.getCurrentWebApplicationContext().getServletContext(); 2 ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc); 3 Map<String, IStrategy> tempMap = ac.getBeansOfType(IStrategy.class);
    //构建context
    4 Map<String, IStrategy> beanMap = new HashMap<>(); 5 for (Map.Entry<String, IStrategy> entry: tempMap.entrySet()) { 6 String type = entry.getValue().getType(); 7 beanMap.put(type, serviceInterfaceEntry.getValue()); 8 } 9 //beginEndBlockFlag是begin/end代码块标识 10 Integer returnVal = beanMap.get(beginEndBlockFlag).doAnalysis(param);

    这样就做到了根据标识自动从map中得到service实例,自动调用业务逻辑方法,做解析。

    to be continue....

  • 相关阅读:
    IIS iframe嵌套的别人的页面 突然就打不开了
    C#基础知识之可空类型
    EditorConfig插件和ESLint
    ES6-ES11新语法之ES10
    ES6-ES11新语法之ES9
    pipenv快速入门
    Pycharm拉取git仓库代码
    【pytest学习10】pytest报告,html,allure
    jira&confluence之什么是epic/feature/story/task
    【pytest学习9】usefixture的简单使用
  • 原文地址:https://www.cnblogs.com/PPBoy/p/11252732.html
Copyright © 2020-2023  润新知