责任链模式(Chain of Responsibility Pattern)
责任链模式是一种对象的行为模式。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
一、
责任链模式的结构
1
、责任链模式涉及的角色
抽象处理者角色
(Handler):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。这个角色通常由一个Java抽象类或Java接口实现。图中的聚合关系给出了具体子类对下家的引用,抽象方法handlerRequest()规范了子类处理请求的操作。
具体处理者角色
(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于处理者持有下家引用,因此,如果需要,具体处理者可以访问下家。
抽象处理者角色
public abstract class Handler
{
protected Handler successor;//
定义下家的引用
public abstract void handleRequest();//
处理方法,调用此方法处理请求
public void setSuccessor(Handler successor)//
赋值方法,调用此方法设置下家
{
this.successor = successor;
}
public Handler getSuccessor()//
取值方法,得到下家对象
{
return successor;
}
}
具体处理者角色
,如果有下家,就将请求传给下家,否则就处理请求
public class ConcreteHandler extends Handler
{
public void handleRequest()
{
if (getSuccessor() != null)
{
System.out.println("The request is passed to " + getSuccessor());
getSuccessor().handleRequest();
}
else
{
System.out.println("The request is handled here.");
}
}
}
客户端角色
public class Client
{
static private Handler handler1, handler2;
public static void main(String[] args)
{
handler1 = new ConcreteHandler();
handler2 = new ConcreteHandler();
handler1.setSuccessor(handler2);
handler1.handleRequest();
}
}
客户端创建了2个处理者对象,并指定第一个处理者对象的下家是第2个处理者对象,而第2个处理者对象没有下家。然后客户端将请求传递给第一个处理者对象。
一个纯的责任链模式要求一个具体的处理者对象只能在2个行为中选择一个:继承责任或者把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收器;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的例子很难找到,一般看到的例子都是不纯的责任链模式的实现。