使用设计模式解决if-else冗余的问题

在日常开发过程中遇到if-else过多的问题

if-else的数量一多,代码非常臃肿,耦合性非常高

如果需要增加或者删除一个if-else,就需要对代码进行很繁琐的修改,但是其实耐心点改起来还好,不过可能会掉头发哦

并且这种if-else的编写破坏了设计模式六大原则中的里氏开闭原则(对拓展开放,修改关闭),不利于后续的变动和修改

为了使代码符合优雅的设计模式和编码形式,现在提供一种新的修改思路供大家参考

改造之前代码:
 

//if - else 的冗余代码
@SpringBootTest
class ConcurrencyApplicationTests {

    @Test
    void contextLoads() throws InterruptedException {
        String name = "张三";
        if (name.equals("张三")){
            System.out.println(name + "你好");
        }
        else if (name.equals("李四")){
             System.out.println(name + "你好");
        }
        else if (name.equals("王五")){
             System.out.println(name + "你好");
        }
    }

}

使用模板方法+策略模式解决:

首先添加一个AbstractHandler抽象类,添加自己的method接口

/**
 * @Author CJ
 * @Date 2024-3-8 15:36
 * @Version 1.0
 * 模板方法模式
 */
public abstract  class AbstractHandler implements InitializingBean {

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

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

引入工厂设计模式:

为了进一步解决if判断,我们使用工厂模式解决

工厂模式可以注册产品,获得产品,以及存储产品

/**
 * @Author CJ
 * @Date 2024-3-8 15:06
 * @Version 1.0
 * 工厂类
 */
public class Factory {
    // map存储参数以及其对应的Handler方法
    private static Map<String, AbstractHandler> strategyMap = new HashMap<>();

    // 从map中取出Handler方法,取出工厂内的产品
    public static AbstractHandler getInvokeStrategy(String str) {
        return strategyMap.get(str);
    }

    // 将键值对注册,添加工厂产品
    public static void register(String str, AbstractHandler handler) {
        // 如果输入进来的键值是空,不符合要求就直接返回
        if (StringUtils.isEmpty(str) || handler == null) {
            throw new IllegalArgumentException("你输入的键值对有空值,不符合要求");
        }
        strategyMap.put(str,handler);
    }
}

 创建消费者具体的实现类:

需要用到method就改写method,需要用到method2就改写method2

/**
 * @Author CJ
 * @Date 2024-3-8 15:02
 * @Version 1.0
 */
@Component
public class Method1Handler extends AbstractHandler {
    @Override
    public void method(String name)  {
          System.out.println(name + "你好");
    }

    // 类初始化自动注册
    @Override
    public void afterPropertiesSet() throws Exception {
        // 这个类初始化的时候,就会自动注册
        Factory.register("李四",this);
    }

如果业务逻辑是两种业务逻辑,比如有的是输出一句话,有的是return一句话,使用模板方法模式就可以避免这种单一的实现方式。

 

/**
 * @Author CJ
 * @Date 2024-3-8 15:02
 * @Version 1.0
 */
@Component
public class Method3Handler extends AbstractHandler {

    public String method2(String name)  {
        return "进展如何";
    }

    // 类初始化自动注册
    @Override
    public void afterPropertiesSet() throws Exception {
        // 这个类初始化的时候,就会自动注册
        Factory.register("王五",this);
    }

}

最终实现效果:

/**
 * @Author CJ
 * @Date 2024-3-7 11:47
 * @Version 1.0
 */
@RestController
@RequestMapping("/designController")
public class DesignController {

    @ApiOperation("设计模式解决if else过多")
    @GetMapping("/design")
    public void contextLoads(@RequestParam(name = "name",required = true) String name) {
        AbstractHandler invokeStrategy = Factory.getInvokeStrategy(name);
        if (invokeStrategy == null) throw new RuntimeException("参数不能为空!");
        invokeStrategy.method(name);
//        System.out.println(invokeStrategy.method2(name));
    }

}

 

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值