`
步行者
  • 浏览: 167850 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

CoR 模式 (一种)

阅读更多

 

 

CoR(Chain of Responsibility) 即职责链设计模式:使多个对象都有机会处理请求(Request),从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

职责链设计模式 大概有三个角色:
(1)请求(
Request):封装请求信息
(2)处理器(
Handler):处理请求(Request),一个具体处理器一般只处理一种请 求,如果它不能处理传递过来的请求,那么它就把该请求传递给职责链中的下一个处理器(后继处理器 successor)。
(3)客户端(
Client):发送请求


定义不再多说,直接看实现。下面是一个传统的CoR实现:

1,代表抽象请求的接口(
Request)

 

public interface Request{
    //......
} 


2,实现
Request接口的实现类,HelpRequest
PrintRequestSaveRequest
    假设有一个文本编辑器,用户界面上有三个按钮 Help,Print 和 Save
   
HelpRequest 代表 当用户点击 Help 按钮时产生的 帮助请求,

    PrintRequest 代表 当用户点击 Print 按钮时产生的 打印请求,
   
SaveRequest 代表 当用户点击 Save 按钮时产生的 保存请求。


//帮助请求
public class HelpRequest implements Request{
    //......
}
//打印请求
public class PrintRequest implements Request{
    //......
}
//保存请求
public class SaveRequest implements Request{
    //......
}
 

3,代表抽象处理器的接口Handler


public interface Handler{
    void handleRequest(Request request);
}

 

4,实现处理器接口的实现类 HelpHandlerPrintHandlerSaveHandler
 
HelpHandler 处理 帮助请求(HelpRequest


public class HelpHandler implements Handler{
    //后继处理器
    private Handler successor;
    public HelpHandler(Handler successor){this.successor = successor;}
    public void handleRequest(Request request) {
        if(request instanceof HelpRequest){
             System.out.println("HelpHandler handle " +request.getClass().getSimpleName());
             // handle request
        }else{
            System.out.println("PrintHandler can't handle "+request.getClass().getSimpleName());
            if(successor != null)
                successor.handleRequest(request);
        }
    }
}

 

    PrintHandler 处理 打印请求(PrintRequest


public class PrintHandler implements Handler{
    //后继处理器
    private Handler successor;
    public PrintHandler(Handler successor){this.successor = successor;}
    public void handleRequest(Request request) {
        if(request instanceof PrintRequest){
            System.out.println("PrintHandler handle "+request.getClass().getSimpleName());
            // handle request
        }else{
            System.out.println("PrintHandler can't handle "+request.getClass().getSimpleName());
           if(successor != null)
                successor.handleRequest(request);
        }
    }
}

 

    SaveHandler处理 保存请求(SaveRequest

 

 

public class SaveHandler implements Handler{
    //后继处理器
    private Handler successor;
    public SaveHandler(Handler successor){this.successor = successor;}
    public void handleRequest(Request request) {
        if(request instanceof SaveRequest){
            System.out.println("SaveHandler handle "+request.getClass().getSimpleName());
            // handle request
        }else{
            System.out.println("SaveHandler can't handle "+request.getClass().getSimpleName());
            if(successor != null)
                successor.handleRequest(request);
        }
    }
}
 

5,客户端 Client


public class Client{
    public static void main(String[] args){
        Handler handler1 = new HelpHandler(null);
        Handler handler2 = new PrintHandler(handler1);
        Handler handler3 = new SaveHandler(handler2);

        handler3.handleRequest(new HelpRequest());
        handler3.handleRequest(new PrintRequest());
        handler3.handleRequest(new SaveRequest());
    }
}

 

运行 Client 类 输出如下:

SaveHandler can't handle HelpRequest
PrintHandler can't handle HelpRequest
HelpHandler handle HelpRequest
SaveHandler can't handle PrintRequest
PrintHandler handle PrintRequest
SaveHandler handle SaveRequest


相关链接 :
http://www.iteye.com/topic/411222 CoR 模式 (另一种)

 

-----------------------------------------------------

 

用抽象类也可以,不过要把 handleRequest 中
(1)这个处理器是否能处理这个请求

(2)处理相应的请求
这两个功能分离出来,定义成抽象方法供子类(具体处理器)实现

 

  1. public abstract class AbstractHandler implements Handler {    
  2.     protected Handler successor;    
  3.     public AbstractHandler(Handler successor) {    
  4.         this.successor = successor;    
  5.     }    
  6.     //定义为final,不能被子类继承  
  7.     public final void handleRequest(Request request) {    
  8.         if (canHandleRequest(request)) {    
  9.             handleRequestMyself(request);  
  10.         } else {    
  11.             if (successor != null)    
  12.                 successor.handleRequest(request);    
  13.         }    
  14.     }    
  15.     //这个处理器能否处理整个请求  
  16.     protected abstract boolean canHandleRequest(Request request);  
  17.     //处理相应的请求  
  18.     protected abstract void handleRequestMyself(Request request);  
  19. }   

 

-----------------------------------------------------

 

PipeLine + Value

lishuaibt 写道
其实纯的责任 链模式我的理解是,一种责任推卸的模式,知道有承担责任的模块接收这个请求,并处理这个请求。这样的情况确实不太多吧。(个人觉得哈)。所谓的 pipeline的概念,在以前的turbine框架(一个非常优秀的MVC框架)中就有使用。其大体模式和概念如下:
    其实PipeLine类似于Servlet里的FilterChain的概念,而valve类似于Filter。就是一个请求流经这个PipeLine中 的每个Valve节点,该节点都对这个请求做一定的处理,而不是纯的责任链模式那样,把责任往下推。是想做了相应的处理后,在把处理后的请求移交给下一个 Valve进行处理。举个例子:在一次请求Servlet的过程中,可能有些处理是所有的请求都需要做的,比如设置CharSet,权限验证,或者URL 的解析等等,这些处理构成了一个请求的Chain,所有的请求都要经过这些处理,才能进行下面的具体的业务处理。这个时候既可以这些共有的处理抽象出来, 做成一个pipeline,这个pipeline有过个valve节点组成。。。。

   差不多就这个意思吧。。。用文字形容确实不太好说。
分享到:
评论
14 楼 bloodwolf_china 2009-06-22  
责任链是一种非常好的模式,但楼主的实现好像有问题,不太好。
看看Servlet Filter,或Mina的实现就知道了。
1、只关注自己的业务职责
2、可以控制流程,如计费策略或其他类似策略可以控制是否终止当前流程,任务链只能顺序执行
13 楼 lishuaibt 2009-06-22  
责任链这种推卸责任的方式用的却是比较少,但是形如pipeline这种任务链条的形式却比较实用
12 楼 icantforget 2009-06-22  
恩 效率确实比较低 感觉用得比较少
11 楼 步行者 2009-06-21  
职责链模式的优点是 每个类只关注自己的职责,降低了类之间的耦合度,而且方便进行职责链的重组。
缺点就是效率比较低。
10 楼 lishuaibt 2009-06-21  
纯的责任链模式 其实就是推卸责任嘛  直到有能处理该请求的的节点出现了,然后进行处理  就需要不停的调用next方法,效率当然就不够高了。。。
相当于是遍历一遍,效率当然就不高了。。(个人理解)
9 楼 whaosoft 2009-06-21  
这种模式好处在哪 不好的地方在哪能说下吗?
8 楼 lishuaibt 2009-06-21  
也有道理。。。。
7 楼 步行者 2009-06-21  
lishuaibt 写道
个人觉得没有必要去区分各种模式,无招胜有招。。。

但是模式已经作为一种公共词汇存在了(Builder,Factory,Singleton,...),
为了看懂别人的代码 和 便于交流,
你也必须了解这些词汇,
要达到“无招胜有招”的境界,
首先也得知己知彼啊。。
6 楼 lishuaibt 2009-06-21  
个人觉得没有必要去区分各种模式,无招胜有招。。。
5 楼 步行者 2009-06-19  
lishuaibt 写道
其实纯的责任链模式我的理解是,一种责任推卸的模式,直到有承担责任的模块接收这个请求,并处理这个请求。这样的情况确实不太多吧。(个人觉得哈)。
    所谓的pipeline的概念,在以前的turbine框架(一个非常优秀的MVC框架)中就有使用。其大体模式和概念如下:
    其实PipeLine类似于Servlet里的FilterChain的概念,而valve类似于Filter。就是一个请求流经这个PipeLine中的每个Valve节点,该节点都对这个请求做一定的处理,而不是纯的责任链模式那样,把责任往下推。是想做了相应的处理后,在把处理后的请求移交给下一个Valve进行处理。举个例子:在一次请求Servlet的过程中,可能有些处理是所有的请求都需要做的,比如设置CharSet,权限验证,或者URL的解析等等,这些处理构成了一个请求的Chain,所有的请求都要经过这些处理,才能进行下面的具体的业务处理。这个时候既可以这些共有的处理抽象出来,做成一个pipeline,这个pipeline有过个valve节点组成。。。。

   差不多就这个意思吧。。。用文字形容确实不太好说。
 
   pipeline:管道
   valve:阀门
   顾名思义就好理解了吧



谢谢解释 !
管道 + 阀门
很生动。。
4 楼 ninini 2009-06-19  
lishuaibt 写道
其实纯的责任链模式我的理解是,一种责任推卸的模式,知道有承担责任的模块接收这个请求,并处理这个请求。这样的情况确实不太多吧。(个人觉得哈)。所谓的pipeline的概念,在以前的turbine框架(一个非常优秀的MVC框架)中就有使用。其大体模式和概念如下:
    其实PipeLine类似于Servlet里的FilterChain的概念,而valve类似于Filter。就是一个请求流经这个PipeLine中的每个Valve节点,该节点都对这个请求做一定的处理,而不是纯的责任链模式那样,把责任往下推。是想做了相应的处理后,在把处理后的请求移交给下一个Valve进行处理。举个例子:在一次请求Servlet的过程中,可能有些处理是所有的请求都需要做的,比如设置CharSet,权限验证,或者URL的解析等等,这些处理构成了一个请求的Chain,所有的请求都要经过这些处理,才能进行下面的具体的业务处理。这个时候既可以这些共有的处理抽象出来,做成一个pipeline,这个pipeline有过个valve节点组成。。。。

   差不多就这个意思吧。。。用文字形容确实不太好说。


PipeLine + Value 中的
Value类似于职责链中的Handler
只不过Value可以处理请求的一部分,并把未处理的部分
通过 PipeLine 传给下一个Value,直到请求全部被处理为止。。
是这个意思吧
3 楼 lishuaibt 2009-06-19  
其实纯的责任链模式我的理解是,一种责任推卸的模式,直到有承担责任的模块接收这个请求,并处理这个请求。这样的情况确实不太多吧。(个人觉得哈)。
    所谓的pipeline的概念,在以前的turbine框架(一个非常优秀的MVC框架)中就有使用。其大体模式和概念如下:
    其实PipeLine类似于Servlet里的FilterChain的概念,而valve类似于Filter。就是一个请求流经这个PipeLine中的每个Valve节点,该节点都对这个请求做一定的处理,而不是纯的责任链模式那样,把责任往下推。是想做了相应的处理后,在把处理后的请求移交给下一个Valve进行处理。举个例子:在一次请求Servlet的过程中,可能有些处理是所有的请求都需要做的,比如设置CharSet,权限验证,或者URL的解析等等,这些处理构成了一个请求的Chain,所有的请求都要经过这些处理,才能进行下面的具体的业务处理。这个时候既可以这些共有的处理抽象出来,做成一个pipeline,这个pipeline有过个valve节点组成。。。。

   差不多就这个意思吧。。。用文字形容确实不太好说。
 
   pipeline:管道
   valve:阀门
   顾名思义就好理解了吧

2 楼 步行者 2009-06-19  
lishuaibt 写道
责任链模式我个人觉得,这种纯的责任链似乎并没有太大的意义,反而感觉效率不高,虽然看起来很规整。tomcat的pipeline的概念和valve的概念,虽然不是纯的责任链模式,但是我觉得这个的应用范围更广一些吧。。。也更为合适一点吧

职责链模式 效率是差了一些
“tomcat的pipeline的概念和valve的概念”,能说明一下吗?
1 楼 lishuaibt 2009-06-19  
责任链模式我个人觉得,这种纯的责任链似乎并没有太大的意义,反而感觉效率不高,虽然看起来很规整。tomcat的pipeline的概念和valve的概念,虽然不是纯的责任链模式,但是我觉得这个的应用范围更广一些吧。。。也更为合适一点吧

相关推荐

    ARM_《IQ》中文杂志_2009_Spring_-4-Cortex-M3的优势

    在v4T架构的基础上,A RM又推出了 T humb指令集架构(I S A),这是一个16 位的I S A,可以改进代码密度(一般约为 ...便可始终以一种模式(Thumb-2)执行, 而不像ARM7那样需要在ARM/Thumb这 两种模式下切换。

    UML面向对象设计与分析基础教程课件第八章

    UML面向对象设计与分析基础教程课件第八章 ...责任链设计模式是一种可用于计多具体领域的行为模式,该模式用于处理一组对象和一个请求之间的关系,当一个请求可以被多个对象处理时,就可以运用这个模式。

    基于多芯光纤的三模复用/解复用器的设计

    根据模式耦合理论, 设计了一种基于三芯光纤并支持LP01、LP11a、LP11b三种空间模式传输的三模复用/解复用器。该三芯光纤由一个位于中央的三模纤芯和两个外部的单模纤芯构成。选择三模纤芯的结构参数, 根据模式有效...

    GPS-RTK测量技术应用探讨.pdf

    RTK测量技术是一种精度高、实时性强的测量技术,它可以广泛应用于各种领域,提高测量效率和精度。但是,RTK测量技术也存在一定的局限性,需要在实际应用中注意这些问题,以取得更好的测量结果。

    双包层七芯光子晶体光纤超连续谱的产生及模式分析

    报道了一种双包层七芯光子晶体光纤,其零色散点在1036 nm,在波长1060 nm处非线性系数为2.43 W-1·km-1。采用中心波长为1060 nm、脉冲宽度为160 ps、重复频率为1 MHz、光束质量M2<1.3、最大输出功率为4.5 W的增益...

    基于wine数据集的数据分析报告(R语言).doc

    所以需要选用一种能够克服离群点 影响的模型来对wine数据集进行预测,因此我们选用了class包中的1- 近邻模型来进行分类预测,结果如表3所示,可以看出分类效果有提高。 表3 直接分类预测结果 "模型 "训练集 "测试集 ...

    论文研究 - 孟加拉国缺少营养元素对湿季稻谷产量的影响

    背景与目的:由于亚洲地区涉及不同的养分管理方案和耕作制度,长期的生育能力研究是监测产量变化的重要因素之一。 对集约灌溉稻作模式进行了许多短期和长期的肥料试验,主要是为了提供肥料用量,但并未考虑对土壤...

    HGE_系列教材(1-9)

    源组(resource groups)采用预先缓存和特殊的清除处理(这是一种通过控制对象分配 和释放来提高效率的方法) <5> GUI:强大而灵活的GUI 管理,支持动画式的GUI <6> 矢量(Vectors),对于2D 矢量的完全支持 3)...

    元器件应用中的国半再推两款I/O隔离的升压DC/DC转换器,可驱动双显示屏..

    这两款芯片采取电流模式控制,并提供10焊球micro SMD及小型16引脚LLP两种封装选择,可驱动双显示屏幕或单一大显示屏幕的串行白光LED背光系统。  LM3502及LM3503转换器可为便携式电子产品双显示屏幕或单一大显示...

    电源技术中的国半再推两款I/O隔离的升压DC/DC转换器

    这两款芯片采取电流模式控制,并提供10焊球micro SMD及小型16引脚LLP两种封装选择,可驱动双显示屏幕或单一大显示屏幕的串行白光LED背光系统。 LM3502及LM3503转换器可为便携式电子产品双显示屏幕或单一大显示屏幕...

    电源技术中的国半再推两款I/O隔离的升压DC/DC转换器,可驱动双显示屏

    这两款芯片采取电流模式控制,并提供10焊球micro SMD及小型16引脚LLP两种封装选择,可驱动双显示屏幕或单一大显示屏幕的串行白光LED背光系统。  LM3502及LM3503转换器可为便携式电子产品双显示屏幕或单一大显示...

    国半再推两款I/O隔离的升压DC/DC转换器 可驱动双显示屏

    这两款芯片采取电流模式控制,并提供10焊球micro SMD及小型16引脚LLP两种封装选择,可驱动双显示屏幕或单一大显示屏幕的串行白光LED背光系统。 LM3502及LM3503转换器可为便携式电子产品双显示屏幕或单一大显示屏幕...

    基于谱域光学相干层析术的互相关法测量空间横向流速

    提出了一种利用互相关性测量空间横向流速的方法。通过设定谱域光学相干层析术系统的扫描模式X 和Y,利用同一深度位置的相邻A 扫信号间的互相关性与空间横向速度分量之间的数学关系,求得空间横向流速的绝对大小。...

    基于谐振耦合现象的三芯光子晶体光纤偏振分束器

    设计了一种三芯光子晶体光纤(PCFs)偏振分束器。利用光纤的谐振现象,实现了偏振状态的分离。当三芯光子晶体光纤中三个超模式的模式折射率满足一定条件时,将产生谐振现象。通过选择合适的光纤结构参数,可使某一偏振...

    大芯径光纤激光器的新进展

    由于光纤纤芯可承受功率和光纤纤芯大小有关,而加大纤芯直径会降低光束质量,为了进一步提高光纤激光输出功率而不降低光束质量,一种方法是设计超大模场双包层光纤,加大光纤中低阶模的直径;另一种方法是加大光纤的纤芯...

    折射率补偿法修正边界元电磁场模拟误差

    边界元方法是一种数值求解偏微分方程的高效算法,在微纳光学求解电磁场问题中有广泛的应用。在实际计算中,边界元数目的选择直接关系着数值模拟的精度。研究不同边界元数目下微腔谐振频率的计算误差,发现主要误差可...

    基于纤芯失配与错位熔接的光纤Mach-Zehnder温度折射率双参量传感器

    介绍了一种基于纤芯失配与错位熔接的光纤Mach-Zehnder干涉仪,实现了折射率-温度双参量传感。将带有凸锥结构的多模光纤段与错位熔接接头作为两个耦合单元,其中凸锥结构增加了包层模式能量,提高了传感器透射谱对比度。...

    基于七芯光纤和少模光纤拼接结构的曲率传感测量

    利用光纤在不同弯曲曲率下的不同形变,提出并验证了一种基于七芯光纤和少模光纤的新型光纤曲率传感器。分别制作了三种不同结构的传感器,利用快速傅里叶变换分析了它们的干涉模式,获得波长的传感灵敏度分别为6.33,...

    2009 达内Unix学习笔记

    其中 <符号模式列表> 是一个用逗号分隔的表 [ugoa]{+|-|=}[rwxXlstugo] chmod u+rw 给用户加权限。同理,u-rw也可以减权限。 chmod u=rw 给用户赋权限。与加权限不一样,赋权限有覆盖的效果。 主要形式有如下几...

Global site tag (gtag.js) - Google Analytics