首页 > 代码库 > [设计模式-行为型]责任链模式(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("=======================================");	}}