取代if else
目录
一 使用策略设计模式+工厂模式+模板方法模式取代if else
关键点:
InitializingBean和它的afterPropertiesSet()方法,抽象类
特点: 适合业务逻辑比较复杂
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("红包"));
}