用设计模式优化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");
        }

Handler类的代码:

@Component
public class HandlerA1{public void A(String name) {
        System.out.println("1111111111AAAAAAAAAAAAA");
    }
}

第一步:使用策略模式优化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的过程就使用了模板方法的设计模式

 

posted @ 2020-11-07 00:08  palapala  阅读(2662)  评论(1编辑  收藏  举报