取代if else

一 使用策略设计模式+工厂模式+模板方法模式取代if else

笔记demo的git地址

关键点: InitializingBean和它的afterPropertiesSet()方法,抽象类

IT老哥讲解的视频地址

特点: 适合业务逻辑比较复杂

1.1 效果测试类

/**
 * @author : lyn
 * 技术点 :
 * @description:
 * @date : 2022/3/15 22:23
 */

@SpringBootTest
public class TestServer {

    /**
     * 策略设计模式+工厂模式+模板方法模式 实现
     */
    @Test
    public void testDesign() {
        AbstractHandler handlerA = HandlerFactory.getInvokeStrategy("a");
        handlerA.methodA();
        AbstractHandler handlerB = HandlerFactory.getInvokeStrategy("b");
        System.out.println(handlerB.methodB());
        AbstractHandler handlerC = HandlerFactory.getInvokeStrategy("c");
        System.out.println(handlerC.methodB());
    }

    /**
     * if else 实现(简单的逻辑判断,建议使用)
     */
    @Test
    public void ifElse() {
        String str = "a";
        if (str.equals("a")) {
            System.out.println("处理a");
        } else if (str.equals("b")) {
            System.out.println("处理b");
        } else if (str.equals("c")) {
            System.out.println("处理c");
        }
    }
}

1.2 关键代码

1.2.1 抽象类
/**
 * @author : lyn
 * 技术点 :模板方法设计模式
 * 可处理对于多种不同的返回逻辑
 * @date : 2022/3/15 21:48
 */
public abstract class AbstractHandler implements InitializingBean {


    public void methodA(){
        //对于未重写的,抛出不支持操作异常
        throw new UnsupportedOperationException();
    }

    public String methodB(){
        throw new UnsupportedOperationException();
    }

}

1.2.2 两个实现
/**
 * @author : lyn
 * 技术点 :
 * @description:
 * @date : 2022/3/15 21:55
 */
@Component
public class OneHandler extends AbstractHandler {

    @Override
    public void methodA() {
        System.out.println("处理逻辑a");
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        HandlerFactory.register("a",this);
    }

}
/**
 * @author : lyn
 * 技术点 :
 * @description:
 * @date : 2022/3/15 21:58
 */
@Component
public class ThreeHandler extends AbstractHandler {

    @Override
    public String methodB() {
        System.out.println("处理逻辑c");
        return "处理逻辑c";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        HandlerFactory.register("c",this);
    }
}

1.2.3 工厂类
/**
 * @author : lyn
 * 技术点 :
 * @description:
 * @date : 2022/3/15 21:59
 */
public class HandlerFactory {

    private static Map<String, AbstractHandler> strategyMap = new HashMap<>();

    public static AbstractHandler getInvokeStrategy(String str) {
        return strategyMap.get(str);
    }

    public static void register(String str, AbstractHandler handler) {
        if (StringUtils.isEmpty(str) || handler == null){
            return;
        }
        strategyMap.put(str, handler);
    }

}

二 Map+函数式接口通过Map.get(key)来代替

原文地址: 还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS

Map+函数式接口通过Map.get(key)来代替 if-else的业务分派

特点: 实现简单,适合业务逻辑比较简单,避免策略类过多

2.1 具体的逻辑操作

@Service
public class GrantTypeService {

   public String redPaper(String resourceId) {
       //红包的发放方式
       return "每周末9点发放";
   }

   public String shopping(String resourceId) {
       //购物券的发放方式
       return "每周三9点发放";
   }

   public String qqVip(String resourceId) {
       //qq会员的发放方式
       return "每周一0点开始秒杀";
   }
}

2.2 Map+函数式接口通过Map.get(key)来代替 if-else的业务分派

/**
 * Map+函数式接口通过Map.get(key)来代替 if-else的业务分派
 */
@Service
public class QueryGrantTypeService {

    @Autowired
    private GrantTypeService grantTypeService;
    private final Map<String, Function<String, String>> grantTypeMap = new HashMap<>();

    /**
     * 初始化业务分派逻辑,代替了if-else部分
     * key: 优惠券类型
     * value: lambda表达式,最终会获得该优惠券的发放方式
     */
    @PostConstruct
    public void dispatcherInit() {
        grantTypeMap.put("红包", grantTypeService::redPaper);
        grantTypeMap.put("购物券", grantTypeService::shopping);
        grantTypeMap.put("qq会员", grantTypeService::qqVip);
    }

    public String getResult(String resourceType) {
        //Controller根据 优惠券类型resourceType、编码resourceId 去查询 发放方式grantType
        Function<String, String> result = grantTypeMap.get(resourceType);
        if (result != null) {
            //传入resourceId 执行这段表达式获得String型的grantType
            return result.apply(resourceType);
        }
        return "查询不到该优惠券的发放方式";
    }
}

2.3 测试类

    @Autowired
    private QueryGrantTypeService queryGrantTypeService;

    /**
     * Map+函数式接口通过Map.get(key)来代替 if-else的业务分派
     */
    @Test
    public void testFunction() {
        System.out.println(queryGrantTypeService.getResult("红包"));
    }
posted @ 2022-03-15 23:01  进击的小蔡鸟  阅读(383)  评论(1编辑  收藏  举报