责任链模式

一、模式提出

  当客户提交一个请求时,请求沿链传递直至有一个具体的操作对象负责处理它。这样就使得接收着和发送者都没有对方明确信息,且链中的对象自己也不知道链中的结构。结果是职责链可简化对象的相互连接,他们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。这样就大大的降低了耦合度。

二、业务背景

有许多数字请求相关的对象处理,而且每个对象处理数字在每一范围类,请问如何设计?

三、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 请求失败!

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值