文档章节

设计模式中的责任链模式解析

加大装益达
 加大装益达
发布于 2017/05/05 18:13
字数 771
阅读 5
收藏 0

原文链接

这篇主要是在看Tomcat源码的时候,遇到了责任链模式相关的东西,做一下简单记录,可以和Tomcat源码中责任链的应用对比学习下,会更有效果。

责任链模式的定义

责任链模式(Chain of Responsibility)是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 《JAVA与模式》-阎宏

责任链模式的结构

责任链模式总共存在两个角色,抽象处理者(Handler)和具体处理者(ConcreteHandler)。

抽象处理者,定义处理请求的接口,通常也会有包含下一个和上一个处理者的方法,抽象处理者一般是一个接口或者抽象类。

具体处理者,是对抽象处理者的实现,不同的实现。当前如果能处理请求,就处理,如果不能处理请求就交给下家处理。

责任链模式的举例

Handler:

package me.cxis.test.gof.chainofresponsibility;

/**
 * Created by cheng.xi on 2017-05-05 17:46.
 */
public abstract class Handler {
    protected Handler successor;

    public abstract void handleRequest(String condition);

    public Handler getSuccessor() {
        return successor;
    }

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
}

ConcreteHandler1:

package me.cxis.test.gof.chainofresponsibility;

/**
 * Created by cheng.xi on 2017-05-05 17:49.
 */
public class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if(condition.equals("1")){
            System.out.println("ConcreteHandler1处理");
            return;
        }else {
            System.out.println("ConcreteHandler1不处理,由其他的Handler处理");
            getSuccessor().handleRequest(condition);
        }
    }
}

ConcreteHandler2:

package me.cxis.test.gof.chainofresponsibility;

/**
 * Created by cheng.xi on 2017-05-05 17:49.
 */
public class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if(condition.equals("2")){
            System.out.println("ConcreteHandler2处理");
            return;
        }else {
            System.out.println("ConcreteHandler2不处理,由其他的Handler处理");
            getSuccessor().handleRequest(condition);
        }
    }
}

ConcreteHandlerX:

package me.cxis.test.gof.chainofresponsibility;

/**
 * Created by cheng.xi on 2017-05-05 17:49.
 */
public class ConcreteHandlerX extends Handler {
    @Override
    public void handleRequest(String condition) {
        //一般是最后一个处理者
        System.out.println("ConcreteHandlerX处理");
    }
}

Client:

package me.cxis.test.gof.chainofresponsibility;

/**
 * Created by cheng.xi on 2017-05-05 17:53.
 */
public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handlerX = new ConcreteHandlerX();

        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handlerX);

        handler1.handleRequest("2");
    }
}

责任链模式的优点

当然上面的例子我们可以直接在Client中写if-else,不过这样耦合度就太高了,而且如果顺序发生变化会很难弄,而责任链模式可以解耦,将发送者和接受者分开。

责任链模式的缺点

责任链可能很长,即便某一个点不处理请求,也需要经过这个点,这样会有性能问题。

责任链模式的应用场景

  • Servlet中的过滤器
  • Tomcat中的Filter
  • Tomcat中容器的设置

© 著作权归作者所有

上一篇: tomcat7架构简介
下一篇: http协议简单解析
加大装益达
粉丝 31
博文 83
码字总数 138659
作品 0
浦东
高级程序员
私信 提问
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
Tomcat 系统架构与设计模式_ 设计模式分析

门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到...

lvzjane
2014/11/03
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
2018/10/10
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
【聚合支付平台】如何智用【模板+工厂】设计模式来实现异步回调

写在前面:设计模式源于生活,而又高于生活! 异步回调流程 解析报文(验证签名) 日志收集(相同) 如果解析报文成功的话,修改支付状态为已经成功.返回不同的支付结果 模版方法设计模式 提...

须臾之余
05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

非webpack require.js + vue + vueRouter + iView 实现按需加载

适合一个人开发的时候,在整个php框架下,又想单页,又可以直接后端assign变量穿透到模板。又不想写接口搞前后分离脚手架一大堆npm 包, 在php模板下 引入require.js <!DOCTYPE html><html...

一箭落旄头
3分钟前
2
0
新特性解读 | MySQL 8.0 窗口函数详解

原创作者: 杨涛涛 背景 一直以来,MySQL 只有针对聚合函数的汇总类功能,比如MAX, AVG 等,没有从 SQL 层针对聚合类每组展开处理的功能。不过 MySQL 开放了 UDF 接口,可以用 C 来自己写UDF...

爱可生
9分钟前
0
0
23.5 jumpserver介绍

23.5 jumpserver介绍 开源堡垒机jumpserver介绍: 官网www.jumpserver.org Jumpserver是一款使用Python, Django开发的开源跳板机系统, 助力互联网企业高效 用户、资产、权限、审计 管理 Auth...

oschina130111
15分钟前
2
0
Spring Cloud 入门教程(七): 消息总线(Spring Cloud Bus)(Greenwich.RELEASE)

参考网址:https://blog.csdn.net/forezp/article/details/81041062,由于此文中作者基于git和rabbitMq,为了适应内网我改造为基于mysql和kafka 一、准备工作 1、安装kafka 参考这个:kafka...

pipi1919
16分钟前
1
0
用人工智能改变企业与客户的连接方式

  随着以AI人工智能技术为主的新一代信息技术的快速商业化落地,我国的数字经济正高歌猛进。2017年我国数字经济对GDP的贡献率为55%,接近甚至超越了某些发达国家水平,2018年我国数字经济规...

琴殇的
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部