一、模式提出
当客户提交一个请求时,请求沿链传递直至有一个具体的操作对象负责处理它。这样就使得接收着和发送者都没有对方明确信息,且链中的对象自己也不知道链中的结构。结果是职责链可简化对象的相互连接,他们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。这样就大大的降低了耦合度。
二、业务背景
有许多数字请求相关的对象处理,而且每个对象处理数字在每一范围类,请问如何设计?
三、UML图
四、详细代码解说
客户端的调用
package com.responsibility.Chain;
/**
* @author DELL
*使得多个对象都有机会处理请求,从而避免请求发送者和
*接受者的耦合关系,将这个对象连成一条链,并沿着这条链
*传递请求,知道有一个对象处理这个请求
*/
public class ClientCallRequest {
public static void main(String[] args) {
AbstractRequest ar1=new HandleRequestObject1();
AbstractRequest ar2=new HandleRequestObject2();
AbstractRequest ar3=new HandleRequestObject3();
/**
*先把这些对象设置成一条链状,相当于队列等待一样
*/
ar1.setChainRequest(ar2);
ar2.setChainRequest(ar3);
//调用对象的请求,也就是该请求调用了哪个对象是透明的,
//即不知是哪个对象在调用该请求
int[] requests={3,23,20,25,12,8,30,31};
for(int request:requests){
ar1.HandleRequest(request);
}
}
}
抽象请求类
package com.responsibility.Chain;
public abstract class AbstractRequest {
private AbstractRequest abstractRequest;
public void SetAbstractRequest(AbstractRequest ar){
this.setChainRequest(ar);
}
public abstract void HandleRequest(int request);
/**
* 设置下一个请求的对象
* @param abstractRequest
*/
public void setChainRequest(AbstractRequest abstractRequest) {
this.abstractRequest = abstractRequest;
}
public AbstractRequest getAbstractRequest() {
return abstractRequest;
}
}
处理请求1类
package com.responsibility.Chain;
/**
* 这个类是请求处理0-10的数字
* @author Administrator
*
*/
public class HandleRequestObject1 extends AbstractRequest {
@Override
public void HandleRequest(int request) {
if(request>0&&request<=10){
System.out.println("Request次数:"+request+" 是由类:HandleRequestObject1 调用");
}else{//如果这个数不符合这个对象就转移个下一个对象处理
this.getAbstractRequest().HandleRequest(request);
}
}
}
处理请求2类
package com.responsibility.Chain;
/**
* 这个对象处理11-20数字的请求
* @author Administrator
*
*/
public class HandleRequestObject2 extends AbstractRequest {
@Override
public void HandleRequest(int request) {
if(request>10&&request<=20){
System.out.println("Request次数:"+request+" 是由类:HandleRequestObject2 调用");
}else{
this.getAbstractRequest().HandleRequest(request);
}
}
}
处理请求2类
package com.responsibility.Chain;
/**
* 这个类是处理21-30数字的请求
* @author Administrator
*
*/
public class HandleRequestObject3 extends AbstractRequest {
@Override
public void HandleRequest(int request) {
if(request>20&&request<31){
System.out.println("Request次数: "+request+" 是由类:HandleRequestObject3 调用");
}else{//如果请求的数字大于30,此请求就失败
System.out.println("Request 请求失败!");
}
}
}
运行的结果
Request次数:3 是由类:HandleRequestObject1 调用
Request次数: 23 是由类:HandleRequestObject3 调用
Request次数:20 是由类:HandleRequestObject2 调用
Request次数: 25 是由类:HandleRequestObject3 调用
Request次数:12 是由类:HandleRequestObject2 调用
Request次数:8 是由类:HandleRequestObject1 调用
Request次数: 30 是由类:HandleRequestObject3 调用
Request 请求失败!