码迷,mamicode.com
首页 > 其他好文 > 详细

[设计模式-行为型]责任链模式(Chain of Responsibility)

时间:2014-05-03 17:38:42      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   class   code   java   

概括

名称

Chain of Responsibility

结构

bubuko.com,布布扣

动机

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用性

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

  • 可处理一个请求的对象集合应被动态指定。


解析

形象比喻:

  晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的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("=======================================");
	}

}






[设计模式-行为型]责任链模式(Chain of Responsibility),布布扣,bubuko.com

[设计模式-行为型]责任链模式(Chain of Responsibility)

标签:des   style   blog   class   code   java   

原文地址:http://blog.csdn.net/oscar999/article/details/24617777

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!