实际上,责任链模式是 一个请求(不管是用户的请求,系统的请求还是哪里来的请求),可以有很多个接收者,这些接受者自身每个都有适合处理这个请求的场景,如果满足自身的场景自己就会处理,如果不满足自己的使用场景就会调用下一个接收者的引用,并把请求传递给下一个接收者来处理,下一个接受者以此类推,所以责任链上的每一环都有对下一环的引用。
比如Struts2的拦截器,一个Action过来,第一道接收者是处理字符编码,如果不满足字符编码,我们进行字符编码的转换,然后如果满足放行条件第一道接收者就会调用下一个接收者,来进行密码的校验,如果第二道校验通过,会自动调用第三道接收者,第三道接收者开始校验权限,权限通过则放行,不通过则返回失败信息…
我们完全不需要知道它一环一环是怎么调用的,我们只需要知道它有这些功能,如果有一项不匹配(比如密码不对),肯定会在某一环被拦截下来,我们只需要把需求发送到责任链上接收的一端,就无需再关心它的实现细节。
接下来用另一个例子加深对责任链的理解,工厂流水线,自动化的,主要工作内容是自动化分拣出各种品质(个头大小)的苹果,贴上不同的价码销往不同的地方:
1.首先新建一个产品类,apple
public class Apple
{
private int weight;//存放苹果的重量,单位是克
public Apple(int weight){
this.weight = weight;
}
public int getWeight(){
return weight;
}
}
2.建立一个分拣苹果设备需要继承的共同抽象类,里面主要写一些公共参数和方法,规范实现方法。
public abstract class Weighing{
public Weighing nextWeighing;//存放对下一分拣设备的引用
public void setWeighing(Weighing nextWeighing){
this.nextWeighing = nextWeighing