责任链模式为请求创建了一个接受者的对象的链。这种模式对给予请求的类型,对请求的发送者和接受者进行解耦。属于行为型模式。
在这种模式中,通常每个接受者都包含对另一个接受者的引用。如果一个对象不能处理该请求,那么他会把相同的请求传给下一个接受者。以此类推。
应用实例:servlet的Filter,过滤器和拦截器都是基于此模式的。
/**
*
* 请求类
*
*/
public class BrrowRequest {
private int requestMoney;
public BrrowRequest(int requestMoney){
this.requestMoney = requestMoney;
System.out.println("有人借钱 "+requestMoney+" 元");
}
public int getRequestMoney() {
return requestMoney;
}
}
/*
* 抽象处理结点类
*/
abstract class AbstractPerson {
//下一个结点
private AbstractPerson superPerson;
//处理结点的名称
protected String typePerson;
public void setSuperPerson(AbstractPerson superPerson) {
this.superPerson = superPerson;
}
//该结点可以处理的额度
public abstract int getLimit();
//获得该结点名称
public String getType(){
return typePerson;
}
//具体的处理细节
public void detailRequest(BrrowRequest br){
if(getLimit() >= br.getRequestMoney()){
System.out.println(getType()+"可以处理借款");
}else{
if(this.superPerson != null){
this.superPerson.detailRequest(br);
}else{
System.out.println("没有人可以处理借款");
}
}
}
}
/*
* 具体处理类
*/
public class Clerk extends AbstractPerson {
public Clerk(){
super.typePerson = "职员";
}
@Override
public int getLimit() {
return 1000;
}
}
/*
* 具体处理类
*/
public class Counter extends AbstractPerson {
public Counter(){
super.typePerson = "柜台";
}
@Override
public int getLimit() {
return 2000;
}
}
/*
* 具体处理类
*/
public class Manager extends AbstractPerson {
public Manager() {
super.typePerson = "经理";
}
@Override
public int getLimit() {
// TODO 自动生成的方法存根
return 5000;
}
}
public class Main {
public static void main(String[] args) {
AbstractPerson c = new Clerk();
AbstractPerson co = new Counter();
AbstractPerson m = new Manager();
//请求
BrrowRequest b = new BrrowRequest(7000);
//构建请求处理链
c.setSuperPerson(co);
co.setSuperPerson(m);
c.detailRequest(b);
}
}
抽象出一个处理结点(AbstractPerson),所以的具体实现结点(Clerk,Counter,Manager)都继承这个结点,实现自定义的数据,最后传进来一个请求,通过某种方法对请求判断,看自己这个结点可不可以处理,否则交由下一个结点继续处理。
参考:https://zhuanlan.zhihu.com/p/24737592