去掉if else 使用策略工厂模式

java开发过程中,有时候可能会有很多个if else ,后来随着业务逻辑变得更复杂,if else 会更多,这个时候我们的code会变得很难维护和阅读,那么现在就需要我们去掉if else ,使用策略工厂模式

设计模式就不多解释了,如果不太懂的,百度搜索下
那么我就直接上手了,贴code

  1. 创建 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;
	}
}

  1. 创建CommandHandler类
package com.x.x.x.x;


public interface CommandHandler {

	/**
	 * 执行业务逻辑
	 */
	String handle(Object obj);
}

  1. 业务处理类
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;
    }
}

  1. 测试

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 请看分支 策略工厂模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值