在日常开发过程中遇到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));
}
}