责任链模式

责任链模式定义

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

责任链模式结构图

在这里插入图片描述

责任链模式角色介绍

抽象处理者,Handler,一个为抽象类,它定义了一个处理请求的接口;同时它会持有一个抽象处理者类型的成员变量,表示请求链路的下一个处理者。

具体处理者,ConcreteHandler,它是抽象处理者的子类,处理用户请求,以及转发请求给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。

责任链模式结构代码

抽象处理者:

public abstract class Handler {

    protected Handler nextHandler;

    public Handler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract String handlerRequest(int num);
}

具体处理者1:

public class ConcreteHandler1 extends Handler {

    public ConcreteHandler1(Handler nextHandler) {
        super(nextHandler);
    }

    public String handlerRequest(int num) {
        if (num<10){
            return "小于10";
        }else {
            if (nextHandler==null){
                return "没有下一处理者";
            }
            return nextHandler.handlerRequest(num);
        }
    }
}

具体处理者2:

public class ConcreteHandler2 extends Handler {

    public ConcreteHandler2(Handler nextHandler) {
        super(nextHandler);
    }

    public String handlerRequest(int num) {
        if (num>20){
            return "小于10";
        }else {
            if (nextHandler==null){
                return "没有下一处理者";
            }
            return nextHandler.handlerRequest(num);
        }
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        Handler handler = new ConcreteHandler1(new ConcreteHandler2(null));
        String result = handler.handlerRequest(1);
        System.out.println("result = " + result);
    }
}
责任链模式运行机制

责任链模式,每个具体处理者类持有一个抽象处理者类型的成员变量,表示下一个处理者;每一个处理者都会选择性处理自己应该处理的业务逻辑,然后再将请求传递给下一个处理者;依次就形成了一个处理链条。

责任链模式解决的核心问题

责任链模式将请求和处理进行解耦,请求者可以不知道具体的处理者,处理者也不知道请求的全貌,两者解耦,提高系统的灵活性。

责任链模式扩展

上面所述的责任链模式,我给它划分为私有链模式,也叫手拉手模式,也就是各个具体处理者类都会持有下一个处理者对象,处理者之间就像手拉手一样,实现请求的处理和传递。

除了这种私有链模式,还有一种公有链模式,每个具体处理者类不负责持有下一个具体处理者对象,而是将其交给一个专门的类进行管理,这个专门的类就是公有链类。

责任链模式扩展-公有链模式结构图

在这里插入图片描述

责任链模式之公有链模式增加的角色

公有链角色,HandlerChain,负责持有所有具体处理者对象,并负责维护、操作由具体处理者形成的链。

责任链模式之公有链模式结构代码

抽象处理者:

public abstract class Handler {

    public abstract String handlerRequest(int num,HandlerChain chain);
}

具体处理者1:

public class ConcreteHandler1 extends Handler {

    public String handlerRequest(int num,HandlerChain chain) {
        if (num<10){
            return "小于10";
        }else {
            return chain.doHandlerChain(num);
        }
    }
}

具体处理者2:

public class ConcreteHandler2 extends Handler {

    public String handlerRequest(int num,HandlerChain chain) {
        if (num>20){
            return "小于10";
        }else {
            return chain.doHandlerChain(num);
        }
    }
}

公有链:

public class HandlerChain {

    private final List<Handler> handlers = new ArrayList<Handler>();

    private int index = 0;

    public void addHandler(Handler handler){
        handlers.add(handler);
    }

    public String doHandlerChain(int num){
        Handler handler = handlers.get(index);
        if (handler == null){
            return "没有下一处理者";
        }
        ++index;
        return handler.handlerRequest(num,this);
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        HandlerChain chain = new HandlerChain();
        chain.addHandler(handler1);
        chain.addHandler(handler2);
        String result = chain.doHandlerChain(1);

        System.out.println("result = " + result);
    }
}
责任链模式之公有链模式运行机制

抽出一个单独的类HandlerChain作为处理者的维护者和操作者;
它负责持有处理者,并将它们按顺序组装成链,这个链就是公有链;
客户端通过chain启动对处理者们的调用;
各个处理者处理完自己负责的业务逻辑之后,再将请求传递给chain,chain按链式顺序继续操作下一个处理者。

私有链和公有链对比

私有链结构简单,但每一个处理者都要维护下一个处理者,前后存在耦合,业务请求链变更比较麻烦;
公有链结构复杂,需要单独类来维护请求链,但各个处理者无需维护下一处理者,只关心自己就好,请求流转都交给公有链处理,业务链比较清晰,也更具有灵活性。

两者要结合实际业务情况,选择适当的模式结构。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值