Java PatternDesign of GOF(四人帮力作,享誉15年)第十五模式

Java PatternDesign of GOF(四人帮力作,享誉15年)

第十五模式

板桥里人 http://www.jdon.com 2002/04/21(转载请保留)

Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

如何使用?

虽然这一段是如何使用CoR,但是也是演示什么是CoR.

有一个Handler接口:

public interface Handler{

public void handleRequest();

}

这是一个处理request的事例, 如果有多种request,比如 请求帮助 请求打印 或请求格式化:

最先想到的解决方案是:在接口中增加多个请求:

public interface Handler{

public void handleHelp();

public void handlePrint();

public void handleFormat();

}

具体是一段实现接口Handler代码:

public class ConcreteHandler implements Handler{

private Handler successor;

public ConcreteHandler(Handler successor){

this.successor=successor;

}

public void handleHelp(){

//具体处理请求Help的代码

...

}

public void handlePrint(){

//如果是print 转去处理Print

successor.handlePrint();

}

public void handleFormat(){

//如果是Format 转去处理format

successor.handleFormat();

}

}

一共有三个这样的具体实现类,上面是处理help,还有处理Print 处理Format这大概是我们最常用的编程思路。

虽然思路简单明了,但是有一个扩展问题,如果我们需要再增加一个请求request种类,需要修改接口及其每一个实现。

第二方案:将每种request都变成一个接口,因此我们有以下代码 :

public interface HelpHandler{

public void handleHelp();

}

public interface PrintHandler{

public void handlePrint();

}

public interface FormatHandler{

public void handleFormat();

}

public class ConcreteHandler

implements HelpHandler,PrintHandler,FormatHandlet{

private HelpHandler helpSuccessor;

private PrintHandler printSuccessor;

private FormatHandler formatSuccessor;

public ConcreteHandler(HelpHandler helpSuccessor,PrintHandler printSuccessor,FormatHandler             formatSuccessor)

{

this.helpSuccessor=helpSuccessor;

this.printSuccessor=printSuccessor;

this.formatSuccessor=formatSuccessor;

}

public void handleHelp(){

.......

}

public void handlePrint(){this.printSuccessor=printSuccessor;}

public void handleFormat(){this.formatSuccessor=formatSuccessor;}

}

这个办法在增加新的请求request情况下,只是节省了接口的修改量,接口实现ConcreteHandler还需要修改。而且代码显然不简单美丽。

解决方案3: 在Handler接口中只使用一个参数化方法:

public interface Handler{

public void handleRequest(String request);

}

那么Handler实现代码如下:

public class ConcreteHandler implements Handler{

private Handler successor;

public ConcreteHandler(Handler successor){

this.successor=successor;

}

public void handleRequest(String request){

if (request.equals("Help")){

//这里是处理Help的具体代码

}else

//传递到下一个

successor.handle(request);

}

}

}

这里先假设request是String类型,如果不是怎么办?当然我们可以创建一个专门类Request

最后解决方案:接口Handler的代码如下:

public interface Handler{

public void handleRequest(Request request);

}

Request类的定义:

public class Request{

private String type;

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

public String getType(){return type;}

public void execute(){

//request真正具体行为代码

}

}

那么Handler实现代码如下:

public class ConcreteHandler implements Handler{

private Handler successor;

public ConcreteHandler(Handler successor){

this.successor=successor;

}

public void handleRequest(Request request){

if (request instanceof HelpRequest){

//这里是处理Help的具体代码

}else if (request instanceof PrintRequst){

request.execute();

}else

//传递到下一个

successor.handle(request);

}

}

}

这个解决方案就是CoR, 在一个链上,都有相应职责的类,因此叫Chain of Responsibility.

CoR的优点:

因为无法预知来自外界(客户端)的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。

缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成,当然也可以用树的概念优化。 在Java AWT1.0中,对于鼠标按键事情的处理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR

扩展性差,因为在CoR中,一定要有一个统一的接口Handler.局限性就在这里。

与Command模式区别:

Command 模式需要事先协商客户端和服务器端的调用关系,比如 1 代表 start 2 代表 move 等,这些 都是封装在 request 中,到达服务器端再分解。

CoR 模式就无需这种事先约定,服务器端可以使用 CoR 模式进行客户端请求的猜测,一个个猜测 试验。

java 四人帮,Java PatternDesign of GOF(四人帮巨著,享誉15年)第十五模式相关推荐

  1. java微信公众号中文乱码,java微信公众平台获取用户信息中文乱码解决办法(第十五课)...

    开发者在开发微信公众平台的时候,往往需要获取关注公众号的基本用户信息,其中信息中含有中文,但是根据微信官方文档,调用接口返回的用户json字符串信息中含有中文乱码,我们先来看看接口调用地址. 参数描述 ...

  2. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)

    具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...

  3. java十五章_java:第十五章

    第十五章 字符串1.字符串(String)的定义 String str="内容"; String str=new String(); //内容为null String str=ne ...

  4. 介绍java -cp java -jar的区别

    java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...

  5. 【Java】Java连接Mysql数据库的demo示例

    [Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...

  6. java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文

    [Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...

  7. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...

  8. Java 异常java.lang.IllegalArgumentException: Illegal group reference

    Java 异常java.lang.IllegalArgumentException: Illegal group reference 参考文章: (1)Java 异常java.lang.Illegal ...

  9. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

最新文章

  1. 4篇SCI,1篇A类期刊,这位复旦博士生分享自身科研经验
  2. 数据库外键示例 - 使用sqlite演示
  3. day18-事务与连接池 3.jdbc中事务操作介绍
  4. hdu 5492(矩阵模型的变形)
  5. python右对齐格式化输出_Python中格式化输出的两种方法介绍
  6. Maven3版本的超级POM位置及中央仓库位置
  7. r语言调用python_python3调用R语言干货
  8. 内联元素转化为内联块元素的一些小细节
  9. 关于Nginx有没可能漏记请求日志或Nginx重复向后端发请求
  10. DHCP中继原理与配置
  11. 窗台上晒了一本书,三个人问了三个问题
  12. 惠普HP Laser 107a 打印机驱动
  13. 中级电工技术实训考核装置
  14. android 4.0.3固件,OPPO Find3 android 4.0固件正式发布
  15. nevada用计算机弹,Nevada吉他谱(gtp谱,指弹,独奏,演奏视频)_Vicetone
  16. js click与onclick事件绑定,触发与解绑
  17. PYQT5(17)-高级界面控件-表格与树
  18. (三)GNSS定位中的定位系统和误差源
  19. Python爬取网易云音乐评论,反爬算啥啊!
  20. HTML、CSS学习笔记3(平面转换:位移、旋转、缩放,渐变)

热门文章

  1. C#中利用Linq.Dynamic实现简单的动态表达式构建查询
  2. java网页解析包_java 网页解析工具包 Jsoup
  3. python 根据名称获取pid_【Python学习笔记】76、常用第三方模块psutil
  4. html5的交互标签,html5里交互元素的使用方法
  5. 如何用计算机算矩阵,【活用工具】教你如何用卡西欧fx82es计算机计算复数 矩阵...
  6. java解析xml中文字符乱码_Eclipse读取xml中文乱码问题解决
  7. java 如何实现对象克隆_Java对象克隆
  8. 有没有必要买python课_请问自学 Python 有必要买课程吗?
  9. java abs前缀变量_JAVA工具例大全--cn.hutool.setting.AbsSetting读取配置文件例子
  10. 怎么将小部件图标添加回Windows11任务栏