Java实现责任链模式

责任链模式是一种设计模式,用于处理请求的解耦。在责任链模式中,多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的直接依赖关系。每个处理者都可以决定是否处理请求以及将请求传递给下一个处理者。

简介

责任链模式由一条链组成,每个处理者都有一个对下一个处理者的引用。当请求进入链中时,从链的开头开始依次询问每个处理者是否能够处理该请求。如果某个处理者能够处理请求,则处理请求并结束链,否则将请求传递给下一个处理者。这样,请求会在链上依次传递,直到有一个处理者能够处理请求或者到达链的末尾。

使用场景

责任链模式因为可以灵活地配置处理者的顺序和数量,而不需要修改客户端代码。所以责任链模式在项目实战中用处广泛。

  • JDK中的异常处理机制就使用了责任链模式。当某个方法抛出异常时,首先会在方法内部寻找try-catch块来捕获异常,如果没有找到,就会将异常向上一层抛出,直至找到合适的catch块处理。
  • Spring框架中的拦截器链机制也使用了责任链模式。拦截器链是通过将各个拦截器按照一定的顺序连接起来形成一个链条,在请求处理过程中按顺序调用每个拦截器的相应方法来完成一系列操作。

责任链模式还可以用于处理日志记录、用户权限验证等场景。

开发实例

现在我简单用Java代码实现责任链模式,帮助大家快速入门理解

定义责任链抽象类

首先需要定义责任链抽象类,其作用是定义一个抽象的责任链,将处理请求的对象串联起来,并且定义了处理请求的方法。

@Data
public abstract class AbstractHandler<T> {
    protected String name;

    protected AbstractHandler<T>  nextHandler;

    public AbstractHandler(String name){
        this.name = name;
    }

    public boolean hasNextHandler(){
        return nextHandler != null;
    }

    /**
     * 业务处理方法
     * @param t 传入参数
     * @return
     */
    public abstract T process(T t);
}

具体业务处理类

业务处理类1

/**
 * 将传入的数字加2
 */
public class AddTwoHandler extends AbstractHandler<Integer>{

    public AddTwoHandler(String name) {
        super(name);
    }

    @Override
    public Integer process(Integer t) {
        t = t + 2;
        if(hasNextHandler()) {
            return nextHandler.process(t);
        }
        return t;
    }
}

业务处理类2

/**
 * 将传入的数字乘3
 */
public class MultiThreeHandler extends AbstractHandler<Integer>{
    public MultiThreeHandler(String name) {
        super(name);
    }

    @Override
    public Integer process(Integer t) {
        t = t * 3;
        if(hasNextHandler()) {
            return nextHandler.process(t);
        }
        return t;
    }
}

业务处理类3

/**
 *  将传入的数字减1
 */
public class DecreaseOneHandler extends AbstractHandler<Integer>{
    public DecreaseOneHandler(String name) {
        super(name);
    }

    @Override
    public Integer process(Integer t) {
        t = t - 1;
        if(hasNextHandler()) {
            return nextHandler.process(t);
        }
        return t;
    }
}

代码测试

public class ChainTest {
    public static void main(String[] args) {
        AddTwoHandler two = new AddTwoHandler("加2");
        DecreaseOneHandler one = new DecreaseOneHandler("减1");
        MultiThreeHandler three = new MultiThreeHandler("乘3");

        two.nextHandler = one;
        one.nextHandler = three;

        Integer result = two.process(5);
        System.out.println(result);
    }
}

实现业务处理是,开始值是5,开始执行“加2”操作 ,之后执行“减1”操作,在之后执行“乘3”操作,最后输出结果18。

在不改变代码的情况下,如果修改链式的处理顺序,那结果也就完全不一样了,这就带来很多可扩展性,我们可以很灵活地改变处理者的顺序和添加新的处理者。

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过实现责任链模式实现请求的处理。责任链模式是一种行为设计模式,它允许将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。每个处理者都可以决定是否将请求传递给下一个处理者,从而形成一条处理链。Tamarack是一个用Java实现责任链模式的微框架,它通过为多个对象提供处理请求的机会,避免将请求的发送者与其接收者耦合。链接接收对象并沿链传递请求,直到对象处理它。 代码实现如下(Java): ```java public abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handleRequest(Request request); } public class ConcreteHandler1 extends Handler { public void handleRequest(Request request) { if (request.getType() == RequestType.TYPE1) { System.out.println(request.getName() + " is handle by ConcreteHandler1"); return; } if (successor != null) { successor.handleRequest(request); } } } public class ConcreteHandler2 extends Handler { public void handleRequest(Request request) { if (request.getType() == RequestType.TYPE2) { System.out.println(request.getName() + " is handle by ConcreteHandler2"); return; } if (successor != null) { successor.handleRequest(request); } } } public class Request { private String name; private RequestType type; public Request(String name, RequestType type) { this.name = name; this.type = type; } public String getName() { return name; } public RequestType getType() { return type; } } public enum RequestType { TYPE1, TYPE2 } public class ChainOfResponsibilityDemo { public static void main(String[] args) { Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); h1.setSuccessor(h2); Request request1 = new Request("Request1", RequestType.TYPE1); h1.handleRequest(request1); Request request2 = new Request("Request2", RequestType.TYPE2); h1.handleRequest(request2); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值