前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-责任链模式

设计模式-责任链模式

作者头像
breezedancer
发布2018-09-12 15:43:06
4580
发布2018-09-12 15:43:06
举报
文章被收录于专栏:技术与生活技术与生活

责任链模式里面的很多对象对其下家的引用而形成一条连锁,请求在这个链条上传递,直到被处理完毕,而客户端并不知道链条上哪个链接点处理了这个事件。开发 Web 项目的时候,过滤器就是这样工作的,过滤器互相嵌套,一个接着一个处理请求。这个好处就是在客户端不在意的情况下动态处理连接点以及分配任务。

按照惯例,先上 UML 类图

  • Handler :抽象处理角色,定义一个处理请求的接口,可以设定返回下家的引用;
  • ConcreteHandler:具体处理角色,接收到请求的具体处理者,可以选择处理也可以不处理,把请求传递下一个连接点。

看下具体的代码: 先把抽象处理者写出来,他是一个抽象类或者接口,这里使用抽象类,每个处理者给一个名字 name 属性

代码语言:javascript
复制
public abstract class Handler {    private String name;    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    public Handler(String name) {        this.name=name;
    }    protected Handler handler;    public Handler getHandler() {        return handler;
    }    public void setHandler(Handler handler) {        this.handler = handler;
    }    public abstract void handle();


}

再把具体的处理者实现出来

代码语言:javascript
复制
public class ConcreteHandler extends Handler{    public ConcreteHandler(String name) {        super(name);
    }    @Override
    public void handle() {

        System.out.println("当前处理:"+getName());        if(getHandler()!=null){
            getHandler().handle();
        }

    }

}

在该具体方法的 handle 里面,处理自个当前需要做的事件,然后寻找后续处理者,把到最后完成。

看下客户端如何处理

代码语言:javascript
复制
public class Client {    public static void main(String[] args) {
        Handler h1=new ConcreteHandler("handler1");
        Handler h2=new ConcreteHandler("handler2");
        h1.setHandler(h2);
        h1.handle();
    }
}

在责任链模式当中,对处理者而言,一旦一个请求只有一个处理者处理了,称之为纯的责任链模式,然并卵,现实没有这么纯的责任链;那么不纯的就是一个请求被0个或多个处理者处理了,这个情况很常见。责任链使得客户端请求与接收端处理减低耦合度,使得多个处理者都可以处理这个请求。这个链可以是一棵树,也可以是链表,也可以是个环。但是每个处理者只可以传递任务给下一个处理者,或者自己处理掉,不可能同时传递多个。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术与生活 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档