栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

责任链模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

责任链模式

什么是责任链模式

责任链模式是一种行为设计模式,请求会被一个责任链按照顺序处理,每个处理器会处理请求并决定要不要将请求传给下个处理器。

什么时候可以使用责任链模式

当需要做一系列平行操作时,可以使用责任链模式。
例如,需要对用户发表的评论和文章过滤,需要过滤政治敏感、色情相关、不文明等词语,这个时候就可以设计多个敏感词过滤器并组成责任链,将文章内容交给责任链进行处理。
还有一个场景,当接受到一个用户的发起交易的请求时,可能会有多种鉴权的步骤需要进行,需要验证这个用户是否属于系统,这个用户是否合法,是否被冻结,可能需要验证用户的ip,这个时候可以设计一个责任链,用来处理用户的请求,当其中一个不满足时,这个请求就不应该再继续下去。

责任链模式代码演示

责任链实现方式有多种,这里演示使用继承实现责任链。 图片演示:

// 定一个抽象类Handler
public abstract class Handler {
   //用来保存下一个Handler的属性,在满足一定条件时将请求交给下个Handler处理
    protected Handler successor = null;

    //用来设置下个Handler
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

   //调用真正的处理请求的方法,当满足一定条件时,调用下个Handler处理请求
    public final void handle() {
        boolean handled = doHandle();
        if(!handled && null != successor) {
            successor.handle();
        }
    }

   //真正的处理请求的方法,每个具体的Handler必须实现的方法
    public abstract boolean doHandle();
}

// 定一个HandlerA,继承Handler类
public class HandlerA extends Handler {

    @Override
    public boolean doHandle() {
        boolean handled = false;

        System.out.println("HandlerA ... ");

        return handled;
    }
}

// 定一个HandlerA,继承Handler类
public class HandlerB extends Handler {

    @Override
    public boolean doHandle() {
        boolean handled = false;

        System.out.println("HandlerB ... ");

        return handled;
    }
}

//定一个HandlerChain类,这个是责任链,保存这链头和链尾
public class HandlerChain {
    //链头 
    private Handler head = null;
    //链尾
    private Handler tail = null;

    //将具体的Handler添加到责任链中
    public void addHandler(Handler handler) {
        //新添加的Handler是链尾,所以它后面没有任何Handler,设置为null
        handler.setSuccessor(null);

        //如果第一次添加Handler,那么head和tail指向同一个handler
        if(null == head) {
            head = handler;
            tail = handler;
            return;
        }

        //给当前的链尾设置handler,将最新的handler接到链尾
        tail.setSuccessor(handler);
        //将链尾指针指向最新的handler
        tail = handler;
    }
    
    //对外提供方法调用责任链中的handler
    public void handle() {
        if(null != head) {
            head.handle();
        }
    }
}

public class Application {
    public static void main(String[] args) {
        HandlerChain chain = new HandlerChain();
        chain.addHandler(new HandlerA());
        chain.addHandler(new HandlerB());
        chain.handle();
    }
}

在HandlerChain的实现中,可以使用链表来保存handler,也可以使用数组来保存handler.

责任链的优缺点 优点
  • 满足开闭原则,添加新的handler方便。
  • 你可以控制请求处理的顺序。
  • 单一职责原则。 你可对发起操作和执行操作的类进行解耦。
缺点
  • 部分请求可能未被处理
灵活使用责任链

上面的责任链代码中,如果请求内容没有满足否个条件,马上终止处理,也可以灵活变通一下,将判断的代码移除,这样每个处理器都可以走一遍,在某些场景下可以使用。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号