首页 > 代码库 > [设计模式-行为型]责任链模式(Chain of Responsibility)
[设计模式-行为型]责任链模式(Chain of Responsibility)
概括
名称 | Chain of Responsibility |
结构 | |
动机 | 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 |
适用性 |
|
解析
形象比喻:
晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎,找纸条,写上"Hi, 可以做我的女朋友吗?如果不愿意请向前传",纸条就一个接一个的传上去, 槽糕,传到第一排的MM把纸条传给老师了,听说是一个老处女,快跑!
在责任链模式中, 很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。
参与者有:
1.Handler
定义一个处理请求的接口。
(可选)实现后继链。
2.ConcreteHandler
处理它所负责的请求。
可访问它的后继者。
如果可处理该请求,就处理它;否则将该请求转发给它的后继者。
3.Client
向链上的具体处理者(ConcreteHandler)对象提交请求。
实例
这里还是举产品生产的例子。
软件生产分为软件生产, 硬件生产和组装。
当一个硬件生产的Hanlder 接到一个组成的请求时, 它会把这个请求交给特定的hanlder处理。
涉及的文件:
RequestHandle.java -- 处理类的接口
ProductRequestHandle.java -- 处理组装的请求
SWRequestHandle.java -- 处理软件请求
HWRequestHandle.java -- 处理硬件请求
Request.java - 请求类的接口
BuildupRequest.java - 组装请求
SWRequest.java - 软件请求
TestMain.java - 测试类
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;public interface RequestHandle {void handleRequest(Request request);}
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;public class ProductRequestHandle implements RequestHandle { @Override public void handleRequest(Request request) { // TODO Auto-generated method stub if (request instanceof BuildupRequest) { System.out.println("Build Up Product Request"); } System.out.println("Request Completed!"); }}
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;public class SWRequestHandle implements RequestHandle { RequestHandle rh; public SWRequestHandle(RequestHandle rh) { this.rh = rh; } @Override public void handleRequest(Request request) { // TODO Auto-generated method stub if (request instanceof SWRequest) { System.out.println("Handle Software Product Request"); }else{ rh.handleRequest(request); } }}
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;public class HWRequestHandle implements RequestHandle { RequestHandle rh; public HWRequestHandle(RequestHandle rh) { this.rh = rh; } @Override public void handleRequest(Request request) { // TODO Auto-generated method stub if (request instanceof HWRequest) { System.out.println("Handle Hardware Product Request"); }else{ rh.handleRequest(request); } }}
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;public interface Request {}
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;public class BuildupRequest implements Request {}
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;public class SWRequest implements Request {}
/** * @author oscar999 * @date 2014-4-29 * @version V1.0 */package designptn.reschain;/** * @author Administrator * */public class TestMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub RequestHandle buildup = new ProductRequestHandle(); RequestHandle sw = new SWRequestHandle(buildup); RequestHandle hw = new HWRequestHandle(sw); // Request request = new BuildupRequest(); buildup.handleRequest(request); System.out.println("======================================="); // request = new SWRequest(); sw.handleRequest(request); System.out.println("======================================="); request = new BuildupRequest(); hw.handleRequest(request); System.out.println("======================================="); }}