java 【设计模式】责任链模式

最近碰到一个需求
满足规则 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中间加一个,新增一个实现并且调整一下注入顺序 也解决了,现在代码维护性变高了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值