CoR(Chain of Responsibility) 即职责链设计模式:使多个对象都有机会处理请求(Request),从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
职责链设计模式 大概有三个角色:
(1)请求(Request):封装请求信息
(2)处理器(Handler):处理请求(Request),一个具体处理器一般只处理一种请 求,如果它不能处理传递过来的请求,那么它就把该请求传递给职责链中的下一个处理器(后继处理器 successor)。
(3)客户端(Client):发送请求
定义不再多说,直接看实现。下面是一个传统的CoR实现:
1,代表抽象请求的接口(Request)
public interface Request{
//......
}
2,实现Request接口的实现类,HelpRequest,PrintRequest,SaveRequest
假设有一个文本编辑器,用户界面上有三个按钮 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,实现处理器接口的实现类 HelpHandler,PrintHandler,SaveHandler:
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)处理相应的请求
这两个功能分离出来,定义成抽象方法供子类(具体处理器)实现
- public abstract class AbstractHandler implements Handler {
- protected Handler successor;
- public AbstractHandler(Handler successor) {
- this.successor = successor;
- }
-
- public final void handleRequest(Request request) {
- if (canHandleRequest(request)) {
- handleRequestMyself(request);
- } else {
- if (successor != null)
- successor.handleRequest(request);
- }
- }
-
- protected abstract boolean canHandleRequest(Request request);
-
- protected abstract void handleRequestMyself(Request request);
- }
-----------------------------------------------------
PipeLine + Value
lishuaibt 写道
其实纯的责任
链模式我的理解是,一种责任推卸的模式,知道有承担责任的模块接收这个请求,并处理这个请求。这样的情况确实不太多吧。(个人觉得哈)。所谓的
pipeline的概念,在以前的turbine框架(一个非常优秀的MVC框架)中就有使用。其大体模式和概念如下:
其实PipeLine类似于Servlet里的FilterChain的概念,而valve类似于Filter。就是一个请求流经这个PipeLine中
的每个Valve节点,该节点都对这个请求做一定的处理,而不是纯的责任链模式那样,把责任往下推。是想做了相应的处理后,在把处理后的请求移交给下一个
Valve进行处理。举个例子:在一次请求Servlet的过程中,可能有些处理是所有的请求都需要做的,比如设置CharSet,权限验证,或者URL
的解析等等,这些处理构成了一个请求的Chain,所有的请求都要经过这些处理,才能进行下面的具体的业务处理。这个时候既可以这些共有的处理抽象出来,
做成一个pipeline,这个pipeline有过个valve节点组成。。。。
差不多就这个意思吧。。。用文字形容确实不太好说。
分享到:
相关推荐
4. **Chain of Responsibility模式**(Chapter 17 CoR):CoR模式允许将多个处理者对象链接在一起,形成一个责任链。请求沿着链传递,直到某个处理者处理它。这种方式使得系统可以动态改变处理顺序,增加了灵活性。 ...
在.NET框架中,WPF(Windows Presentation Foundation)是微软推出的一种用于构建富客户端应用程序的技术,它结合了图形、布局、数据绑定、多媒体等元素,为开发者提供了强大的UI设计能力。当我们深入研究WPF的源...
### 一种新的协同网络增强型中继策略:深入解析 #### 概述 协同网络的增强型中继策略,作为现代通信技术中的一个重要分支,旨在通过优化中继节点的功能,提高无线通信网络的性能和可靠性。传统的中继策略,如放大...
基线修正是一种常见的数据分析技术,特别是在信号处理、地震学、生物医学信号分析等领域中,用于消除数据中的非特异性趋势,以便更好地识别和分析感兴趣的信号。 描述中提到"进行趋势项修正,对于在数据序列中存在...
责任链模式是设计模式中的一种行为模式,它允许在对象之间建立一条链,并沿着这条链传递请求,直到有一个对象处理该请求。在这个Java实现的责任链模式中,我们可以通过类的组合而非继承来创建一个处理请求的链条,...
5. **颜色模式**:"cor"库提供了一种切换颜色模式的机制,可以在256色或16色模式间切换,以适应不同的终端环境。 6. **自定义颜色**:除了预定义的颜色外,"cor"还允许你通过RGB值自定义颜色,给开发者提供了更大的...
责任链模式(Chain of Responsibility,CoR)是一种行为设计模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象处理这个请求。每个处理者对象都包含对下一个处理者的引用,如果当前处理者无法处理...
CORDIC(Coordinate Rotation Digital Computer,坐标旋转数字计算机)算法是一种高效的数字信号处理技术,广泛应用于硬件实现中的矢量旋转、复数运算、三角函数计算、取反正切等多个领域。这个压缩包“CORDIC-Data....
CORDIC(Coordinate Rotation Digital Computer)算法,也称为旋转变换算法,是一种在数字信号处理和计算几何中广泛使用的高效算法。该算法最初由Jack E. Volder于1959年提出,主要用于实现在硬件上进行复数运算,如...
在软件工程中,责任链设计模式是一种行为设计模式,它允许在对象之间分发请求,使得一个类不必指定接收请求的对象。在这个项目"es6-loan-cor"中,它被应用于贷款管理审批系统,以实现一个灵活的、可扩展的审批流程。...
UML面向对象设计与分析基础教程课件第八章 ...责任链设计模式是一种可用于计多具体领域的行为模式,该模式用于处理一组对象和一个请求之间的关系,当一个请求可以被多个对象处理时,就可以运用这个模式。
ASN.1是一种用于定义数据结构和消息格式的标准语言,在通信协议中广泛应用。在这次更正中,一个名为“Data-Field”的新序列被引入,用以替代原有的序列。 #### Data-Field序列详解 Data-Field序列包含以下元素: ...
Cortex-M3 是由 ARM 公司设计的一种微控制器内核,它属于 ARMv7 架构的一部分,主要应用于嵌入式系统领域。与 ARM 的其他内核相比,Cortex-M3 更加注重成本效率、低功耗以及实时性能。 - **特点**: - 高效的指令...
四层架构是一种常见的软件设计模式,通常包括以下四个层次: 1. **用户界面层**:这一层是用户与系统交互的接口,负责提供友好的图形用户界面(GUI),使用户能够方便地操作和获取信息。 2. **业务逻辑层**:也...
MVC模式鼓励分离关注点,使得开发者可以独立地处理业务逻辑(Controller)、数据模型(Model)和用户界面(View)。在ASP.NET MVC中,Controller接收用户请求,处理业务逻辑,更新Model,并指示View来显示结果。 ...
“SSTL0MODE”、“SPI0ADDR0LN”、“SC0POLARITY”等参数,分别代表了不同的信号特性和电气特性,如SSTL(Stub Series Terminated Logic)是一种用于内存接口的低电压差分信号技术,SPI(Serial Peripheral ...
MVC模式是一种用于组织应用程序的方式,其中模型(Model)代表数据和业务逻辑,视图(View)负责展示数据(模型),而控制器(Controller)负责接收用户输入并调用模型和视图。MVC模式分离了应用程序的这三个核心...
3. SpreadCycle动力模式:SpreadCycle是一种先进的驱动模式,专门针对电机的动态性能进行优化。在该模式下,驱动器能够更有效地利用电机产生的扭矩,从而实现更快的加速度和更高的运行速度。对于需要频繁启动和停止...
本文探讨了一种基于灰度共生矩阵的图像分割方法,该方法特别适用于具有明显纹理特征的山地背景图像,如航拍图。图像分割是图像处理中的关键步骤,它旨在将图像划分为不同的区域,每一块区域具有相似的特性,如颜色、...