Light  Rain serena

«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告

期待

超级好友 Rachel


我的分类(专题)

首页(262)
知识积累(40)
乐瑟温柔(108)
经验杂谈(20)
良辰吉日(2)
杂七杂八(57)
天景共赏(10)
感触文字(23)


最新日志
sunshine girl
过云雨
summer whisper
边走边唱
岛歌
不必在乎我是谁
如果有来生
Fing Fing 下
大明宫
我没有魅力

最新回复
回复:边界类、控制类、实体类
回复:边界类、控制类、实体类
回复:边界类、控制类、实体类
回复:《极地特快》插曲《When Chr
回复:边界类、控制类、实体类
回复:不必在乎我是谁
回复:边界类、控制类、实体类
回复:如果有来生
回复:Fing Fing 下
回复:我没有魅力

留言板
签写新留言

老大&老师,我想你.....
好文好多阿
886电台 好听
cai
您的子域名已开通
hi
祝福
祝福

你好

统计
blog名称:小雨
日志总数:262
评论数量:1273
留言数量:15
访问次数:4694228
建立时间:2005年1月8日

链接

有事?
音乐,永不厌倦
宁静的心情驿站
我的声音
TIPOblog
tipo bbs
appleVB
网页设计
英语学习2
英语学习3
FLASH
网络书籍
网络电台



我的博客朋友
最有技术的blog
xenium
花差花差
瓜少
span
a lai
琦少
陈少
v
阿当
http://www.ypb.cc/
痞子若鱼
另一个同行
年轻人bcims

 




W3CHINA Blog首页    管理页面    写新日志    退出

[知识积累]java设计模式之Chain of Responsibility
小雨 发表于 2005/4/10 8:28:01

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.局限性就在这里。 参与论坛讨论:http://www.matrix.org.cn/javaforum.asp更多技术文章:http://www.matrix.org.cn/javaarticle.aspMatrix java门户:http://www.matrix.org.cn/java.asp 原文地址:http://www.matrix.org.cn/article/52.html

阅读全文(1774) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.631 second(s), page refreshed 144796514 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号