- 浏览: 98324 次
- 性别:
- 来自: 深圳
文章分类
最新评论
Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是由GoF提出的23种软件设计模式的一种。Chain of Responsibility模式是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。
本文介绍设计模式中的(Chain of Responsibility)模式的概念,用法,以及实际应用中怎么样使用该模式进行开发。
Chain of Responsibility模式是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。Chain of Responsibility模式通常通过在这些对象链之间,传递一个叫做消息或请求的值(request),让每个对象根据request的不同完成不同的职责。
我们举例来说明Chain of Responsibility模式的概念。
例1:
比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。
首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,...,直到D完成d部分。
例2:
比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。
例3:
软件窗口的消息传播。
例4:
SERVLET容器的过滤器(Filter)框架实现。
1,对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。
2,消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
3,处于对象链中的对象的职责分配。不同的对象完成不同的职责。
4,任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。
1,责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
2,可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
3,类与类之间可以以松耦合的形式加以组织。
缺点:
因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。
在该范例中,我们模拟了汽车组装的过程:假设一辆汽车从生产到出厂要经过以下四个过程:组装车头,车身,车尾,以及上色。
我们使用Chain of Responsibility模式来模拟这个过程。
文件一览:
Client
测试类
CarHandler
抽象类。汽车组装抽象接口
CarHeadHandler
组装车头的类
CarBodyHandler
组装车身的类
CarTailHandler
组装车尾的类
CarColorHandler
为汽车上色的类
代码:
Chain of Responsibility模式的概念
Chain of Responsibility模式是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。Chain of Responsibility模式通常通过在这些对象链之间,传递一个叫做消息或请求的值(request),让每个对象根据request的不同完成不同的职责。
我们举例来说明Chain of Responsibility模式的概念。
例1:
比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。
首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,...,直到D完成d部分。
例2:
比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。
例3:
软件窗口的消息传播。
例4:
SERVLET容器的过滤器(Filter)框架实现。
Chain of Responsibility模式的实现
要实现Chain of Responsibility模式,需要满足该模式的基本要件:1,对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。
2,消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
3,处于对象链中的对象的职责分配。不同的对象完成不同的职责。
4,任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。
Chain of Responsibility模式的优优缺点:
优点:1,责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
2,可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
3,类与类之间可以以松耦合的形式加以组织。
缺点:
因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。
Chain of Responsibility模式的应用范例
下面,我们使用一个比较常用的方法实现Chain of Responsibility模式。在该范例中,我们模拟了汽车组装的过程:假设一辆汽车从生产到出厂要经过以下四个过程:组装车头,车身,车尾,以及上色。
我们使用Chain of Responsibility模式来模拟这个过程。
文件一览:
Client
测试类
CarHandler
抽象类。汽车组装抽象接口
CarHeadHandler
组装车头的类
CarBodyHandler
组装车身的类
CarTailHandler
组装车尾的类
CarColorHandler
为汽车上色的类
代码:
public class Client {
public static void main(String[] args) {
//工作流程1:先组装车头,然后是车身,车尾,最后是上色
System.out.println("---workfolow1----");
CarHandler carHandler1 = new CarHeadHandler();
carHandler1.setNextCarHandler(
new CarBodyHandler()).setNextCarHandler(
new CarTailHandler()).setNextCarHandler(
new CarColorHandler());
carHandler1.handleCar(CarHandler.STEP_HANDLE_COLOR);
//工作流程2:因为某种原因,我们需要先组装车尾,然后是车身,车头,最后是上色
System.out.println("---workfolow2---");
CarHandler carHandler2 = new CarTailHandler();
carHandler2.setNextCarHandler(
new CarBodyHandler()).setNextCarHandler(
new CarHeadHandler()).setNextCarHandler(
new CarColorHandler());
carHandler2.handleCar(CarHandler.STEP_HANDLE_COLOR);
}
}
/**
* Handler & subclass
*/
abstract class CarHandler {
public static final int STEP_HANDLE_HEAD = 0;
public static final int STEP_HANDLE_BODY = 0;
public static final int STEP_HANDLE_TAIL = 0;
public static final int STEP_HANDLE_COLOR = 3;
protected CarHandler carHandler;
public CarHandler setNextCarHandler(CarHandler carHandler) {
this.carHandler = carHandler;
return this.carHandler;
}
abstract public void handleCar(int lastStep);
}
class CarHeadHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_HEAD <= lastStep) {
System.out.println("Handle car's head.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
class CarBodyHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_BODY <= lastStep) {
System.out.println("Handle car's body.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
class CarTailHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_TAIL <= lastStep) {
System.out.println("Handle car's tail.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
class CarColorHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_COLOR == lastStep) {
System.out.println("Handle car's color.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
执行Client,输出结果:
public static void main(String[] args) {
//工作流程1:先组装车头,然后是车身,车尾,最后是上色
System.out.println("---workfolow1----");
CarHandler carHandler1 = new CarHeadHandler();
carHandler1.setNextCarHandler(
new CarBodyHandler()).setNextCarHandler(
new CarTailHandler()).setNextCarHandler(
new CarColorHandler());
carHandler1.handleCar(CarHandler.STEP_HANDLE_COLOR);
//工作流程2:因为某种原因,我们需要先组装车尾,然后是车身,车头,最后是上色
System.out.println("---workfolow2---");
CarHandler carHandler2 = new CarTailHandler();
carHandler2.setNextCarHandler(
new CarBodyHandler()).setNextCarHandler(
new CarHeadHandler()).setNextCarHandler(
new CarColorHandler());
carHandler2.handleCar(CarHandler.STEP_HANDLE_COLOR);
}
}
/**
* Handler & subclass
*/
abstract class CarHandler {
public static final int STEP_HANDLE_HEAD = 0;
public static final int STEP_HANDLE_BODY = 0;
public static final int STEP_HANDLE_TAIL = 0;
public static final int STEP_HANDLE_COLOR = 3;
protected CarHandler carHandler;
public CarHandler setNextCarHandler(CarHandler carHandler) {
this.carHandler = carHandler;
return this.carHandler;
}
abstract public void handleCar(int lastStep);
}
class CarHeadHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_HEAD <= lastStep) {
System.out.println("Handle car's head.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
class CarBodyHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_BODY <= lastStep) {
System.out.println("Handle car's body.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
class CarTailHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_TAIL <= lastStep) {
System.out.println("Handle car's tail.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
class CarColorHandler extends CarHandler {
@Override
public void handleCar(int lastStep) {
if (STEP_HANDLE_COLOR == lastStep) {
System.out.println("Handle car's color.");
}
if (carHandler != null) {
carHandler.handleCar(lastStep);
}
}
}
执行Client,输出结果:
C:\Chain of Responsibility>javac *.java
C:\Chain of Responsibility>java Client
---workfolow1----
Handle car's head.
Handle car's body.
Handle car's tail.
Handle car's color.
---workfolow2---
Handle car's tail.
Handle car's body.
Handle car's head.
Handle car's color.
C:\Chain of Responsibility>
我们可以看到,虽然因为外部原因需要改变组装流程,但我们只要重新组织一下对象链的顺序便可柔软地对应这种需求变化。C:\Chain of Responsibility>java Client
---workfolow1----
Handle car's head.
Handle car's body.
Handle car's tail.
Handle car's color.
---workfolow2---
Handle car's tail.
Handle car's body.
Handle car's head.
Handle car's color.
C:\Chain of Responsibility>
发表评论
-
设计模式之 State - 状态模式
2010-12-18 16:49 1071State模式也叫状态模式,是由GoF提出的23种软件设计模式 ... -
设计模式之 Strategy - 策略模式
2010-12-18 16:46 1343Strategy模式也叫策略模 ... -
设计模式之 Visitor - 访问者模式
2010-12-18 16:45 1443Visitor模式也叫访问者 ... -
设计模式之 Template Method - 模板方法模式
2010-12-18 16:41 1562Template Method模式也叫模板方法模式,是由G ... -
设计模式之 Observer - 观察者模式
2010-12-18 16:33 1371Observer模式也叫观察者 ... -
设计模式之 Memento - 备忘录模式
2010-12-18 16:31 1043Memento模式也叫备忘录 ... -
设计模式之 Mediator - 中介者模式
2010-12-18 16:29 1103Mediator模式也叫中介者模式,是由GoF提出的23种软件 ... -
设计模式之 Iterator - 迭代模式
2010-12-18 16:27 1162Iterator模式也叫迭代模式,是由GoF提出的23种设 ... -
设计模式之 Interpreter - 解释器模式
2010-12-18 16:23 983Interpreter模式也叫解释器模式,是由GoF提出的 ... -
设计模式之 Command - 命令模式
2010-12-18 16:20 862Command(CoR)模式也叫命 ... -
设计模式之 Proxy - 代理模式
2010-12-16 23:45 1040Proxy模式也叫代理模式,是由GoF提出的23种软件设计 ... -
设计模式之 Flyweight - 享元模式
2010-12-16 23:42 1031Flyweight模式也叫享元模式,是由GoF提出的23种 ... -
设计模式之 Facade - 外观模式
2010-12-16 23:41 991Facade模式也叫外观模式 ... -
设计模式之 Singleton - 单态模式
2010-11-26 11:58 845Singleton模式也叫单态模式,是由GoF提出的2 ... -
设计模式之 Decorator - 装饰模式
2010-11-25 23:48 802装饰模式,The Decorator Pattern atta ... -
设计模式之 Composite - 组合模式
2010-11-25 23:35 1448Composite模式也叫组合 ... -
设计模式之 Bridge - 桥接模式
2010-11-25 23:08 1006Bridge模式也叫桥接模式,是由GoF提出的23种软件设计模 ... -
设计模式之 Adapter - 适配器模式
2010-11-25 22:58 904Adapter模式也叫适配器模式,是由GoF提出的23种设 ... -
设计模式之Prototype - 原型模式
2010-11-25 22:14 1123Prototype模式也叫原型模式,是由GoF提出的23种设计 ... -
设计模式之 Builder - 建造者模式
2010-11-18 23:51 1034Builder模式也叫建造者模式或者生成器模式,是由GoF ...
相关推荐
C#面向对象设计模式 (行为型模式) Chain Of Responsibility 职责链模式 视频讲座下载
C#面向对象设计模式 Chain of Responsibility 职责链模式 视频讲座下载
C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式
职责链模式 设计模式 Chain of Responsibility 若有问题望指出。
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) (Level 300)
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式)
创建模式: ...设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
设计模式参考文档 ...设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { ...
本文实例讲述了Python设计模式之职责链模式原理与用法。分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系。将对象连成链并...
C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式 C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释...
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 职责链模式的一个...
创建型: 1. 单件模式(Singleton ... 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
一、 职责链(Chain of Responsibility)模式 160 二、 责任链模式的结构 160 三、 责任链模式的示意性源代码 160 四、 纯的与不纯的责任链模式 163 五、 责任链模式的实际应用案例 163 六、 责任链模式的实现 168 ...
用C++简单的实现职责链(Chain of Responsibility)。
13)职责链模式(Chain of Responsibility) 14)命令模式(Command) 15)解析器模式(Interpreter) 16)迭代器模式(Iterator) 17)中介模式(Mediator) 18)备忘录模式(Memento) 19)观察者模式(Observer)...
本电子书一共两个压缩文档,本文件为part2. ...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献