使用工厂设计模式+策略模式+模板设计模式对大量if-else语句进行改造

1.情景介绍

    /*
    *
    *
    * 具体改造过多的if-else
    *
    *   if(张三){
    *       //张三业务
    *       System.out.println("张三业务执行");
    *       //
    *   }else if(李四业务){
    *       //李四业务
    *       System.out.println("李四业务执行");
    *       //
    *   }else if(王五){
    *       //王五业务
    *       return "王五业务执行";
    *       //
    *   }else if(...){
    *       //...
    *   }
    *   ...
    *
    *   使用到的设计模式如下:
    *       1.工厂模式
    *       2.策略设计模式
    *       3.模板方法模式
    *   
    *   情景分析:
    *       进行抽取策略时,张三李四业务方法无返回值,而王五业务方法有返回值
    *
    * */

2.解决思想

1.使用策略模式进行将if-else中业务方法进行抽取,使用不同的Handler进行解决

2.使用工厂设计模式进行管理Handler的注册与获取

3.使用模板方法设计模式进行解决不同业务方法的实现问题

3.实现步骤

3.1定义Handler(策略模式+模板方法设计模式)

public abstract class AbstractHandler implements InitializingBean {


    //子类业务是AAA还是BBB就实现哪种方法,没实现的当调用时会抛出不支持该实现异常

    public void AAA(String name){
        throw new UnsupportedOperationException();
    }

    public String BBB(String name){
        throw new UnsupportedOperationException();
    }

}

3.2使用Factory进行管理Handler(工厂设计模式)

public class Factory2 {
    //Handler容器
    private static Map<String,AbstractHandler> strategyMap = new HashMap<>();
    
    //获取
    public static AbstractHandler getInvokeHandler(String name){
        return strategyMap.get(name);
    }
    
    //注册
    public static void register(String name,AbstractHandler abstractHandler){
        if (StringUtils.isEmpty(name) || null == abstractHandler){
            return;
        }
        strategyMap.put(name,abstractHandler);
    }

}

3.3实现每个子类Handler

张三

@Component
public class ZhangsanHandler2 extends AbstractHandler{

    @Override
    public void AAA(String name) {
        System.out.println("张三业务执行");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Factory2.register("张三",this);
    }
}

李四

@Component
public class LisiHandler2 extends AbstractHandler{

    @Override
    public void AAA(String name) {
        System.out.println("李四业务执行了");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Factory2.register("李四",this);
    }
}

王五

@Component
public class WangwuHandler extends AbstractHandler{

    @Override
    public String BBB(String name) {
        return "王五业务执行了";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Factory2.register("王五",this);
    }
}

4.1测试

    /**
     * 工厂 + 策略 + 模板设计模式
     */
    @Test
    public void test(){
        String name  = "王五";
        AbstractHandler invokeHandler = Factory2.getInvokeHandler(name);
        System.out.println(invokeHandler.BBB(name));

        String name2 = "李四";
        Handler invokeHandler2 = Factory.getInvokeHandler(name2);
        invokeHandler2.AAA(name2);

    }

结果

5.优点

使用该方式进行重构对我们的部分强耦合业务进行了有效的解构,方便后期维护,如果后期有不同的模式,只需实现Handler即可

6.其他场景

当我们在设计不同支付方式业务时即可使用该方法(支付宝,微信,第三方,现金....等)

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值