文档章节

设计模式18——Chain of Responsibility设计模式

小米米儿小
 小米米儿小
发布于 2014/01/26 15:58
字数 657
阅读 146
收藏 6

Chain of Responsibility(CoR)责任链设计模式是用一系列请求处理器试图处理一个请求,这些请求处理器之间是一个松散耦合,唯一的共同点是在他们之间传递请求。例如客户端发送一个请求,请求处理器A先处理,如果A没有处理或者无法处理,就将请求传递给请求处理器B,如果B没有处理或者无法处理,就将请求传递到请求处理器C去处理,所有这些请求处理器构成一条请求处理责任链。Chain of Responsibility责任链设计模式的结构如下:

Chain of Responsibility责任链设计模式的时序图如下:


一个处理数字,字母和特殊符号的例子演示Chain of Responsibility,代码如下:

//抽象请求处理器
abstract class Handler{
    private Handler successor;

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

    public Handler getSuccessor(){
        return successor;
    }

    public void handRequest(Request request);
}


//Request请求类
class Request{
    private String type;

    public Request(String type){
        this.type = type;
    }

    public String getType(){
        return type;
    }
}


//数字请求处理器
class NumberHandler extends Handler{
    public NumberHandler(){ }

    public NumberHandler(Handler successor){
        super(successor);
    }

    public void handRequest(Request request){
        if(request.getType().equals(“Number”)){
            System.out.println(“Number has been handled”);
        }
        //传递到下一个请求处理器处理
        else{
            getSuccessor().handRequest(request);
        }
    } 
}


//字母请求处理器
class CharacterHandler extends Handler{
    public CharacterHandler(){ }

    public CharacterHandler(Handler successor){
        super(successor);
    }

    public void handRequest(Request request){
        if(request.getType().equals(“Character”)){
            System.out.println(“Character has been handled”);
        }
        //传递到下一个请求处理器处理
        else{
            getSuccessor().handRequest(request);
        }
    } 
}


//特殊符号请求处理器
class SymbolHandler extends Handler{
    public SymbolHandler(){ }

    public SymbolHandler(Handler successor){
        super(successor);
    }

    public void handRequest(Request request){
        if(request.getType().equals(“Symbol”)){
            System.out.println(“Symbol has been handled”);
        }
        //传递到下一个请求处理器处理
        else{
            getSuccessor().handRequest(request);
        }
    } 
}


public class Application{
    public static void main(String[] args){
        Handler numberHandler = new NumberHandler();
        Handler characterHandler = new CharacterHandler();
        Handler symbolHandler = new SymbolHandler();
		
        numberHandler.setSuccessor(characterHandler);
        characterHandler.setSuccessor(symbolHandler);
        Request request1 = new Request(“Number”);
        Request request2 = new Request(“Character”);
        Request request3 = new Request(“Symbol”);

        numberHandler. handRequest(request1);
        numberHandler. handRequest(request2);
        numberHandler. handRequest(request3);
    } 
}


Java中Chain of Responsibility的两个应用例子:

(1).Java的异常处理机制,当程序中发生异常时,try-catch会比较所捕捉的异常是否符合异常类型,如果符合就执行所设定的处理,如果都没有比对到适当的异常,就会将异常丢出try-catch区块之外。

(2).Struts1.x中的filter过滤器链,Struts2.x中拦截器链等等,将HTTP请求处理中的字符编码转换,加密/解密等常用功能分别作为一个个的请求处理器,接收到客户端请求时对其进行处理,同时在向客户端返回服务端响应时也使用这些处理器进行处理。

本文转载自:http://blog.csdn.net/chjttony/article/details/7562591

小米米儿小
粉丝 42
博文 114
码字总数 83921
作品 0
成都
程序员
私信 提问
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
156
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
《PHP设计模式大全》系列分享专栏

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

kaixin_code
2018/11/06
184
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
281
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 HTML5教程 HTML5的基本语法 简单HTML实例制作

现在学习HTML5的方式 目前HTML还处于HTML4与HTML5之间的过渡使用阶段。移动端的Web界面开发已经全面使用HTML5的技术,而在PC端由于用户升级浏览器周期较长,面临着页面的兼容性问题,以及开发...

老码农的一亩三分地
29分钟前
4
0
[Android] 【每日更新书源】「阅读」APP -100+ 精品书源一键导入!每天自动更新最新书源!

我特地写了个爬虫爬取书源,每天自动更新书源(URL是固定的)!大家也可以定期导入一下! 放心!导入时会自动去除重复书源的! 前段时间我发过一个书源大礼包的帖子,不过现在已经无法编辑修...

xiaogg
33分钟前
10
0
Qt编写自定义控件58-直方对称图

一、前言 本控件也非原创控件,是参考网上的代码而来的,对称顾名思义就是将画布平均成上下两部分,将设置的值自动按照画布高度的一半作为参照高度进行绘制,然后增加动态过渡效果,有点类似...

飞扬青云
43分钟前
7
0
Java中创建对象的5种方法

将会列举5种方法去创建 Java 对象,以及他们如何与构造函数交互,并且会有介绍如何去使用这些方法的示例。 作为一个 Java 开发人员,我们每天都会创建大量的 Java 对象,但是我们通常会使用依...

liululee
46分钟前
6
0
Java描述设计模式(11):观察者模式

本文源码:GitHub·点这里 || GitEE·点这里 一、观察者模式 1、概念描述 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多的依赖关系,让多...

知了一笑
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部