责任链模式是一种对象的行为模式。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
1
、责任链模式涉及的角色
抽象处理者角色
(Handler):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。这个角色通常由一个Java抽象类或Java接口实现。图中的聚合关系给出了具体子类对下家的引用,抽象方法handlerRequest()规范了子类处理请求的操作。
具体处理者角色
(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于处理者持有下家引用,因此,如果需要,具体处理者可以访问下家。
2.下面来写段代码看一下
(1)我们先来写个抽象类(接口也可以)
package org.lxh.dao;
public abstract class Handler {
private Handler handler; //定义下家的引用
public abstract void handRequest(); //处理方法,调用这个方法处理请求
public void setHandler(Handler handler) {
this.handler = handler;
}
public Handler getHandler() {
return handler;
}
}
(2)我们接下来为这个抽象类写一个子类,实现具体的抽象方法
package org.lxh.impl;
import org.lxh.dao.Handler;
public class ConcreteHandler extends Handler{
public void handRequest(){
if(getHandler()!=null){
System.out.println("请求交给:"+getHandler()+"处理");
System.out.println("================");
getHandler().handRequest(); //此时getHandler()的值为空,请求交给下家处理
}else{
System.out.println("请求被这里处理");
}
}
}
(3)写一个测试类查看效果
package test;
import org.lxh.dao.Handler;
import org.lxh.impl.ConcreteHandler;
public class Test {
public static void main(String[] args) {
Handler hand1=new ConcreteHandler();
Handler hand2=new ConcreteHandler();
Handler hand3=new ConcreteHandler();
hand1.setHandler(hand2);
hand1.handRequest();
System.out.println("***********请求接着向下传递******************");
hand2.setHandler(hand3);
hand2.handRequest();
}
}
到现在代码就写好了,这个例子比较简单,在if(){}else{}里要写什么可以根据实际需要修改。
下面来看一下运行效果图