最近碰到一个需求
满足规则 1推送一条数据 结束,不满足规则1 满足规则2也可以推送一条,以此类推
最快速的办法就是一堆else if 判断条件。
那产品现在要求你增加一个新的规则,你就新增一个if 这样代码越来越屎,可拓展性也变差了。
这个时候就可以用责任链模式。
首先定义一个接口
public interface Handler {
//校验规则
void handlerRequest(Long time);
//保存数据
void saveData(Long time);
//添加下一个责任链
void setNextHandler(Handler handler);
}
定义实现规则一:
@Service("RuleOne")
public class RuleOne implements Handler{
private Handler handler;
@Override
public void handlerRequest(Long time) {
//满足规则 保存数据
if(time > 500L){
saveData(time);
}else {
//不满足则进入下一个责任链
//否则判断下一个handler是否为空
if(handler != null){
handler.handlerRequest(time);
}
}
}
@Override
public void saveData(Long time) {
System.out.println("保存数据one"+time);
}
@Override
public void setNextHandler(Handler handler) {
this.handler = handler;
}
}
定义实现规则 二:
@Service("RuleTwo")
public class RuleTwo implements Handler{
private Handler handler;
@Override
public void handlerRequest(Long time) {
if(time > 50L){
saveData(time);
}else {
if(handler != null){
handler.handlerRequest(time);
}
}
}
@Override
public void saveData(Long map) {
System.out.println("保存数据Two");
}
@Override
public void setNextHandler(Handler handler) {
this.handler = handler;
}
}
执行层
public class ChainApplication {
private List<Handler> handlerList;
//必须大于1
public ChainApplication (Handler... handlers){
this.handlerList = Arrays.asList(handlers);
for (int i = 0; i < handlerList.size()-1; i++) {
Handler handler = handlerList.get(i);
int next = i + 1;
Handler handler1 = handlerList.get(next);
handler.setNextHandler(handler1);
}
}
//单个
public ChainApplication (Handler handlers){
this.handlerList = Arrays.asList(handlers);
}
public void reponseClient(Long time){
Handler handler = handlerList.get(0);
handler.handlerRequest(time);
}
}
Spring Boot 注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class HandlerBean {
@Resource(name = "RuleOne")
private Handler ruleOne;
@Resource(name = "RuleTwo")
private Handler ruleTwo;
@Bean
public ChainApplication setApplication(){
//对规则判断有严格的要求按照既定顺序添加进去
//例如我的规则 当值>500 则保存数据,否则进入第二个规则
ChainApplication application = new ChainApplication(ruleOne,ruleTwo);
return application;
}
}
测试类
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private ChainApplication chainApplication;
@Test
void chianTest(){
chainApplication.reponseClient(51L);
chainApplication.reponseClient(52L);
chainApplication.reponseClient(501L);
}
}
输出结果
好了 现在产品说 要新增一个规则3 是不是新增一个实现就解决了?
或者在规则1和2中间加一个,新增一个实现并且调整一下注入顺序 也解决了,现在代码维护性变高了。