- 浏览: 694062 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (270)
- Ant Tool Script (12)
- XMLDigest (5)
- MyEclipse8.6 (1)
- RedHat (5)
- SVNVersionController (4)
- BatOperation (6)
- JspAndFaceWeb (66)
- javaSwing (18)
- PHP (12)
- J2SE (6)
- TestToolAndTestManual (12)
- C# (34)
- Java PatternDesign (20)
- Axis2AndWebService (5)
- ITLive (2)
- DBAndControl (10)
- C/C++ (8)
- Andriod (7)
- Python (7)
- JavaWork (16)
- Android-QA (1)
- Apache-Wicket (1)
- POI (1)
- JQuery (2)
- Struts2 (1)
- Flex&Flash (6)
- sdsdsd (0)
- 1212 (0)
最新评论
-
anayomin:
对九楼继续改进
public static <T> ...
Java List 分页 -
H4X0R:
来学习学习,赞一个
Aqua Data Studio 导出SQL -
yankai0219:
现在出现这个错误 Fatal error: Class 'PH ...
纯PHP搭建Apache+Eclipse+xDebug+PHPUnit+MakeGood -
yankai0219:
您好,我在搭建环境中提示PHPUnit_Framework_T ...
纯PHP搭建Apache+Eclipse+xDebug+PHPUnit+MakeGood -
wilsonchen:
chenhailong 写道wilsonchen 写道chen ...
C# RSA和Java RSA互通
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 模式进行客户端请求的猜测,一个个猜测 试验。
发表评论
-
Create A half transparent DIV
2013-01-22 16:49 1149今天遇到了半透明div的创建和跨浏览器的实装 下面给 ... -
backup
2013-01-05 14:20 0http://atoz-tech.blogspot.jp/20 ... -
SpringMVC wizard简单示例
2012-12-28 17:02 0public class UserController ... -
JavaScript模式化编程-字面量和构造方法
2012-12-27 18:22 1035字面量和构造方法 我不知道大家对这个有什么概念。 ... -
JavaScript模式化编程
2012-12-25 10:26 1011我不知道现在生活中的苦是不是对自己是一种好处,我也不知道 ... -
设计模式(要提高编程水平进)
2011-02-27 22:07 1231设计,是编程语 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第十六模式
2011-02-09 08:52 1150Java PatternDesign of GOF(四人帮力作 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第十四模式
2011-02-09 08:49 1018Java PatternDesign of GOF(四人帮力作 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第十三模式
2011-02-09 08:47 1007Java PatternDesign of GOF(四 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第十二模式
2011-02-02 10:15 1101Java PatternDesign of GOF(四 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第十一模式
2011-02-02 10:08 1080Java PatternDesign of GOF(四人帮力作 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第十模式
2011-02-02 10:05 995Java PatternDesign of GOF(四 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第九模式
2011-02-02 10:03 1164Java PatternDesign of GOF(四 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第八模式
2011-02-02 09:58 1053Java PatternDesign of GOF(四人帮力作 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第七模式
2011-02-02 09:54 1138Java PatternDesign of GOF(四人帮力作 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第六模式
2011-02-02 09:51 907Java PatternDesign of GOF(四人帮力 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第五模式
2011-01-31 12:45 1153Java PatternDesign of GOF(四人帮力作 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第四模式
2011-01-31 12:43 1267Java PatternDesign of GOF(四人帮力作 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第三模式
2011-01-31 12:40 1018Java PatternDesign of GOF(四 ... -
Java PatternDesign of GOF(四人帮力作,享誉15年)第二模式
2011-01-31 12:38 1436Java PatternDesign of GOF(四人帮力作 ...
相关推荐
GOF四人组的Design Pattern中文版,设计模式。四人帮,又称Gang of Four。
"patternDesign设计模式例子源码"这个压缩包很可能是包含了一些常见设计模式的实际应用示例,如单例模式、工厂模式、观察者模式等。下面我们将深入探讨这些设计模式及其重要性。 1. **单例模式**:单例模式确保一个...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。在这篇文章中,我们将深入探讨两种常见的设计模式:Facade(外观)模式和Simple Factory(简单工厂)模式。 首先,让...
设计模式是软件工程领域中一套被广泛认可和应用的解决问题的模板或通用解决方案。它不是直接给出代码,而是描述在特定上下文中,如何解决常见设计问题的一种方法。设计模式可以帮助开发者提高代码的可重用性、可读性...
本项目"patterndesign"显然是基于《图解设计模式》这本教材的实践代码库,旨在帮助开发者深入理解和应用设计模式。 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。在Java中,单例模式...
Android、供应链、财务、百度推广、XML、Test、Struts2、Struts、SQLBase、SQLA、Spring、SEO、PHP、PatternDesign、Oracle、OOAD、NNTC、Moblie、Linux、JSP、Jquery、JNTC、Javascrip{过滤}t、JavaOOP、JavaBase、...