• 用设计模式优化if else


    背景

    日常编码中我们经常遇到 很多if else的代码,比如

           String name="";
            if ("1A".equals(name)){
                System.out.println("1111111AAAAAAAAA");
            }else if("2B".equals(name)){
                System.out.println("222222BBBBBB");
            }else if("3C".equals(name)){
                System.out.println("33333CCCCCCC");
            }

    第一步:使用策略模式优化if else里面的逻辑

    把业务逻辑抽取到handler里面

            String name="";
            if ("1A".equals(name)){
               new HandlerA1().A(name);
            }else if("2B".equals(name)){
                new HandlerB1().A(name);
            }else if("3C".equals(name)){
                new HandlerC1().A(name);
            }

    第二步:使用工厂设计模式优化if

    策略模式只是优化了if else里面的逻辑,并没有把if干掉

    下面我们使用工厂模式把if干掉

    1.首先先写一个工厂用来生成我们的策略handler(把所有的handler存放在工厂的strategyMap中)

    public class Factory {
    
        private static Map<String,AbstractHandler> strategyMap = new ConcurrentHashMap<>();
    
        public static void register(String name,AbstractHandler handler){
            strategyMap.put(name,handler);
        }
    
        public static Handler getInvokeStrategy(String name){
            return strategyMap.get(name);
        }
    
    }

    2.我们的所有业务Handler都实现Handler接口

    @Component
    public class HandlerA1 implements   Handler{
    
        @Override
        public void afterPropertiesSet() throws Exception {
            Factory.register("1A",this);
        }
    
        @Override
        public void A(String name) {
            System.out.println("1111111111AAAAAAAAAAAAA");
        }
        @Override
        public void B(String name) {
    
        }
        @Override
        public void C(String name) {
    
        }
    }

    3.而Handler接口有实现了InitializingBean接口

    Spring启动的时候会调用Handler的afterPropertiesSet方法  把Handler注册到Factory工厂

    public abstract interface Handler implements InitializingBean {
        /***
         * 用抽象类做模板方法
         * @param name
         */
        public void A(String name);
    
        public void B(String name);
    
        public void C(String name);
    }

     4.时我们的if else就变成 此时只需要把工厂名字作为参数传进去即可调用对应的if逻辑,

    好处就是 我们加一个if时 只需要加一个业务Handler实现Handler接口即可,不需要修改原来的if代码,对扩展开放,对修改关闭 

            String name="1A";
            Handler handler = Factory.getInvokeStrategy(name);
            handler.A(name);

    第三步:使用模板方法继续优化

    上面第二步的HandlerA1实现Handler的时候 需要把Handler接口的所有方法全部实现

    但是HanderA1并不需要B和C方法

    我们改造Handler接口成一个抽象的AbstractHandler

    public abstract class AbstractHandler implements InitializingBean {
        @Override
        public void afterPropertiesSet() throws Exception {
    
        }
    
        /***
         * 用抽象类做模板方法
         * @param name
         */
        public void A(String name) {
            throw new UnsupportedOperationException();
        }
    
        public void B(String name) {
            throw new UnsupportedOperationException();
        }
    
        public void C(String name) {
            throw new UnsupportedOperationException();
        }
    }

    此时 我们的业务Handler继承AbstractHandler然后还需要实现自己需要的业务方法即可

    ClassLoader 调用findClass的过程就使用了模板方法的设计模式

  • 相关阅读:
    Kotlin 实现类似 C# 的 Event 事件代码
    nim 语言实现迭代器
    nim 语言使用 concept 实现 c# 的interface
    如何在 asp.net core mvc 项目中管理前端插件的引用
    遇到一个在 WPF 中使用 MessageBox 弹出但在打开后却立即自动关闭的问题
    如何在项目生成成功后,自动构建 nuget 包并复制或发布到指定位置
    在类库开发中,如何设定多个 .net 框架目标
    如何在 IIS 中重定向 http 请求至 https
    在 docker 中部署 phpmyadmin 使用 nginx 代理 https 时出现错误无法登录
    禅道中配置电子邮件发信遇到 SMTP 错误:无法连接到 SMTP 主机,点击重试可以成功
  • 原文地址:https://www.cnblogs.com/ssskkk/p/13939526.html
Copyright © 2020-2023  润新知