使用设计模式解决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
    评论
if else语句的代码优化可以通过以下几种方式实现。首先,可以使用三元操作符来代替简单的if-else语句,从而使代码更简洁。例如,将if (foo) bar(); else baz(); 优化为 foo?bar():baz();。其次,可以使用switch语句来替代多个if-else语句,特别是在需要对多个条件进行判断时。这样可以减少代码的嵌套和冗余。另外,可以通过使用多个if语句的嵌套来进行条件判断,但是需要注意减少嵌套层次,以提高代码的可读性和维护性。最后,可以考虑使用设计模式中的策略模式或者状态模式来替代复杂的if-else逻辑,使代码更加灵活和可扩展。总之,通过使用合适的代码结构和设计模式,可以优化if-else语句的代码,提高代码的可读性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [改善丑陋的代码——多重if-else语句优化(卫语句)](https://blog.csdn.net/qq_39485686/article/details/122145405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [js中if语句的几种优化代码写法](https://download.csdn.net/download/weixin_38531630/13667398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值