标签:des style blog class code java
名称 | 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("=======================================");
}
}
[设计模式-行为型]责任链模式(Chain of Responsibility),布布扣,bubuko.com
[设计模式-行为型]责任链模式(Chain of Responsibility)
标签:des style blog class code java
原文地址:http://blog.csdn.net/oscar999/article/details/24617777