java开发过程中,有时候可能会有很多个if else ,后来随着业务逻辑变得更复杂,if else 会更多,这个时候我们的code会变得很难维护和阅读,那么现在就需要我们去掉if else ,使用策略工厂模式
设计模式就不多解释了,如果不太懂的,百度搜索下
那么我就直接上手了,贴code
- 创建 CommandFactory
package com.x.x.x;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 处理器创建工厂
*/
@Slf4j
public class CommandFactory {
private Map<String, CommandHandler> handlers;
private static CommandFactory instance;
private CommandFactory() {
handlers = new HashMap<>();
}
public static CommandFactory getInstance() {
if(instance == null) {
instance = new CommandFactory();
}
return instance;
}
public CommandHandler getHandler(String commandName) {
if (StringUtils.isBlank(commandName)) {
return null;
}
CommandHandler handler = handlers.get(commandName);
if(handler == null) {
//此处获取业务处理的类,通过路径来获取
String className = new StringBuffer(this.getClass().getPackage().getName()).append(".handler.").append(commandName).append("Handler").toString();
try {
Class<CommandHandler> classObj = (Class<CommandHandler>) Class.forName(className);
handler = classObj.newInstance();
handlers.put(commandName, handler);
} catch (Exception e) {
log.error("实例化Handler失败:{}", className);
e.printStackTrace();
}
}
return handler;
}
}
- 创建CommandHandler类
package com.x.x.x.x;
public interface CommandHandler {
/**
* 执行业务逻辑
*/
String handle(Object obj);
}
- 业务处理类
import com.study.cdmy.CommandHandler;
/**
* @Classname Test1Handler
* @Description 这里描述一段话
* @Date 2020/8/3 16:02
*/
public class Test1Handler implements CommandHandler {
@Override
public String handle(Object obj) {
return "执行业务逻辑"+obj;
}
}
import com.study.cdmy.CommandHandler;
/**
* @Classname Test2Handler
* @Description 这里描述一段话
* @Date 2020/8/3 16:02
*/
public class Test2Handler implements CommandHandler {
@Override
public String handle(Object obj) {
return "执行业务逻辑"+obj;
}
}
- 测试
import com.study.cdmy.CommandFactory;
import com.study.cdmy.CommandHandler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
@GetMapping("test")
@ResponseBody
public String test(String param){
/*if("Test1".equals(param)){
//业务逻辑处理
}else if("Test2".equals(param)){
//业务逻辑处理
}*/
CommandHandler handler = CommandFactory.getInstance().getHandler(param);
return handler.handle(param);
}
}
启动服务
访问 http://127.0.0.1:8080/test?param=Test1
访问 http://127.0.0.1:8080/test?param=Test2
当你有很多个判断的时候,只需要写业务逻辑类就行,这样很容易维护,已读
完整code https://gitee.com/mxlgslcd/chengda.git 请看分支 策略工厂模式