定义
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这多个对象连成一条链,
并沿着这条链传递该请求,直到有一个对象处理它为止。
解释
即将请求的处理者们组织成一条链,使请求沿着这条职责链传递,直到有一个处理者将其处理或者传递到链的末尾仍没有被处理。
使用职责链模式,请求发送者不需要关心请求的处理细节,请求是如何传递的以及是谁处理了请求,这样就将请求的发送者与请求的处理者进行了解耦
结构图
基本代码
//处理请求的接口
public abstract class Handler
{
protected Handler successor;//指向下一个请求处理者
//设置下一个处理者
public void SetSuccessor(Handler successor)
{
this.successor=successor;
}
//抽象的处理请求的方法
public abstract void HandlerRequest(int request);
}
//具体请求处理者A
public class ConcreteHandlerA extends Handler
{
//覆盖父类的抽象方法
@Override
public void HandlerRequest(int request)
{
if(request==1)
{
System.out.println(this.getClass().getCanonicalName()+"处理了请求:"+request);
}else
{
if(this.successor!=null)
{
System.out.println(this.getClass().getCanonicalName()+"自身无法处理请求,转给下一个处理者!");
this.successor.HandlerRequest(request);
}
}
}
}
//具体请求处理者B
public class ConcreteHandlerB extends Handler
{
//覆盖父类的抽象方法
@Override
public void HandlerRequest(int request)
{
if(request==2)
{
System.out.println(this.getClass().getCanonicalName()+"处理了请求:"+request);
}else
{
if(this.successor!=null)
{
System.out.println(this.getClass().getCanonicalName()+"自身无法处理请求,转给下一个处理者!");
this.successor.HandlerRequest(request);
}
}
}
}
//具体请求处理者C
//具体请求处理者C
public class ConcreteHandlerC extends Handler
{
//覆盖父类的抽象方法
@Override
public void HandlerRequest(int request)
{
if(request==3)
{
System.out.println(this.getClass().getCanonicalName()+"处理了请求:"+request);
}else
{
if(this.successor!=null)
{
System.out.println(this.getClass().getCanonicalName()+"自身无法处理请求,转给下一个处理者!");
this.successor.HandlerRequest(request);
}
}
}
}
//客户端代码
public static void main(String[] args)
{
Handler handlerA=new ConcreteHandlerA();
Handler handlerB=new ConcreteHandlerB();
Handler handlerC=new ConcreteHandlerC();
handlerA.SetSuccessor(handlerB);
handlerB.SetSuccessor(handlerC);
for(int i=0;i<4;i++)
{
handlerA.HandlerRequest(i);//将请求发送到职责链上
}
}