【转】《JAVA与模式》之责任链模式
《JAVA与模式》之责任链模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
从击鼓传花谈起
击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。
比如说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。击鼓者将花传给贾母,开始传花游戏。花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又贾宝玉传给贾环,由贾环传回给贾母,如此往复,如下图所示。当鼓声停止时,手中有花的人就得执行酒令。
aaarticlea/png;base64,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" alt="" />
击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。
责任链模式的结构
下面使用了一个责任链模式的最简单的实现。
aaarticlea/png;base64,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" alt="" />
责任链模式涉及到的角色如下所示:
● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
● 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
源代码
抽象处理者角色
public abstract class Handler { /**
* 持有后继的责任对象
*/
protected Handler successor;
/**
* 示意处理请求的方法,虽然这个示意方法是没有传入参数的
* 但实际是可以传入参数的,根据具体需要来选择是否传递参数
*/
public abstract void handleRequest();
/**
* 取值方法
*/
public Handler getSuccessor() {
return successor;
}
/**
* 赋值方法,设置后继的责任对象
*/
public void setSuccessor(Handler successor) {
this.successor = successor;
} }
具体处理者角色
public class ConcreteHandler extends Handler {
/**
* 处理方法,调用此方法处理请求
*/
@Override
public void handleRequest() {
/**
* 判断是否有后继的责任对象
* 如果有,就转发请求给后继的责任对象
* 如果没有,则处理请求
*/
if(getSuccessor() != null)
{
System.out.println("放过请求");
getSuccessor().handleRequest();
}else
{
System.out.println("处理请求");
}
} }
客户端类
public class Client { public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreteHandler();
Handler handler2 = new ConcreteHandler();
handler1.setSuccessor(handler2);
//提交请求
handler1.handleRequest();
} }
可以看出,客户端创建了两个处理者对象,并指定第一个处理者对象的下家是第二个处理者对象,而第二个处理者对象没有下家。然后客户端将请求传递给第一个处理者对象。
由于本示例的传递逻辑非常简单:只要有下家,就传给下家处理;如果没有下家,就自行处理。因此,第一个处理者对象接到请求后,会将请求传递给第二个处理者对象。由于第二个处理者对象没有下家,于是自行处理请求。活动时序图如下所示。
aaarticlea/png;base64,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" alt="" />
使用场景
来考虑这样一个功能:申请聚餐费用的管理。
很多公司都是这样的福利,就是项目组或者是部门可以向公司申请一些聚餐费用,用于组织项目组成员或者是部门成员进行聚餐活动。
申请聚餐费用的大致流程一般是:由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。
不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批500元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。
也就是说,当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。
可以使用责任链模式来实现上述功能:当某人提出聚餐费用申请的请求后,该请求会在 项目经理—〉部门经理—〉总经理 这样一条领导处理链上进行传递,发出请求的人并不知道谁会来处理他的请求,每个领导会根据自己的职责范围,来判断是处理请求还是把请求交给更高级别的领导,只要有领导处理了,传递就结束了。
需要把每位领导的处理独立出来,实现成单独的职责处理对象,然后为它们提供一个公共的、抽象的父职责对象,这样就可以在客户端来动态地组合职责链,实现不同的功能要求了。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAogAAAERCAIAAAB3qsH7AAAgAElEQVR4nO2dL8zkxvnHX3RqQaUriKKqUhuyUqRI1auWBBhERQUBMSk+ybAkqgxaFGQFlrigoDpgWFAZBVWGIZZOKqmMwnxhAQsC5wee3/vc3PjPa+/u7Mzsfj7gtO+c7Z19/PXz9YzHMw8GAAAAouEhdAUAAADgHRgzAABARGDMAAAAEYExAwAARATGDAAAEBEYMwAAQERgzAAAABGBMQMAAEQExgwAABARGDMAAEBEYMwAAAARgTEDAABEBMYMAAAQERgzAABARGDMAAAAEYExAwAARATGDAAAEBEYMwAAQERgzAAAABGBMUNEPD4+PgBcmsfHx9DSBtgBxgwR8fCAIOHyoCtIC/QKEUECBR+gK0gL9AoRQQIFH6ArSAv0ChFBAgUfoCtIC/QKEUECBR+gK0gL9AoRQQIFH6ArSAv0ChFx8wm0aZqqqqqqcj6fQNd1ZVnmeW6MOR6PVVXleS5/gsPN6wpuDPQKEXEPCfRwOPR9P/18AlVVZVm29Cco96AruCXQK0TEPSRQjPn63IOu4JZArxAR95BAl4y567qqquq6HsfRPPVOt20r5V3X2Qep67qu67IsnzVmZ/e6rquqKorCGNM0TV3XPn5jbNyDruCWQK8QEfeQQA+HQ9M0fd/3fa/GXJZlWZZ937dtezgcZEvxXbHnw+Eghm2MybKsruuu67IsWzfmsiyLouj7vigKMeNhGJqmORwORVHIh5MfcifEPegKbgn0ChFxDwl0yZjbtjXG2IVVVZVlKXtlWdY0jTGmrmsd4bXelT2Oo3q8fK9Ye9/3Dw8P0oZWs79t7kFXcEugV4iIe0igs13Z4zjKmOqqqmxj1uasNJ3tD+Y5YxaPz5/Qw0r5NX5qNNyDruCWQK8QEfeQQGeNWXqnncJZYy6KYrsxz44Fw5gBIge9QkTcQwKdGvO0z7ltWxn8NTXmpmnUbouiWH/GbH+XdoBjzACRc65eWUB3BVaB3cvDrSdQGW8lT451EJYxRgZnySQhMqRrHEf5cDweZZxXnufH41E2zvNcXFmePesEI+LfOgZbvy7Pc3lE3TRNWZYy5ssZ6X3D3Lyu4MY4V68ofgWCs5c7j9j2oVi7Bm0Nw3BSdW6HO9cVJAfG7BGCsxciBj5AV5AWGLNHCM5eiBj4AF1BWmDMHiE4eyFi4AN0BWmBMXuE4OyFiIEPPOlKZoA5ZwzdnUyJCnvBmD1CcPZCxMAHPnSV57m8ilYUxQnD62QOcxYdgVliNOamaeRtEJ2PUKbdn758KfMlyTskEYLN7IWIgQ8urqthGPS9cPvzLpZmgAGIzpjVj4/HY5ZlOj3C7KwIUnjO2yAyQbEnsJm9EDHwwcV1Zc/9Yow5bcIWjBmWiMuYu66zJS69PfLZ03RFp93qbgSb2cuLFy/8zvkCd8mLFy8uK1SMGbwSlzHr4nRTpsZsryxrM45jVVUyz5F5cndZ7a6qKp2ZQbvHnWvsglw2OPcAEQMfXFxXGDN4JS5jtlfOcZgas64saxe2bSsd4HVdi+ilS1ymJNRCOaBMOywL8F3wVyjYzF6IGPgAY4a0SNiYZwuzLNNHzrqEbZZl+izZXnDe94WBzeyFiIEPLq6rruu0r47BX3Bxbs2YnQVodQnb6UJ7BmOODyIGPvChK30fpKoque+Xl0ScacxnCwWMGZaIy5jLsrSVOo6jvoC/3Zinb09hzKmgETsej3oeo30d7prYD1zOfPjSdZ12IA3DUNe1vpd4q/i4EodhKMvSHs4iy3c6L4nMFhrrPWZZHOzi1YOkicuYRcSadIqisLudtxhznufq5TLmy6was+xu3wFcEIx5Lxox9R5/IwDSQptlZvKAcy9939u730O7jSsR0iIuYzZzK8iap6nvpGtaC2dXlh2GIcsyGd0t7QB5BUseCNmr4QqysaeXpkgHe5GIybC+tm1lgJ6e8Xumqiq9QcGY98KVCGkRnTELZ64gu2u12l0b74J0sBeJmLzGllmoHsZxdBrQ9kzFjmz6vp+e3KXCaWV2FTrH1Fptae5v6a1ZMea+750fLn9Ov3ocx2EYNhqzs/swDHLYcRz9XTKe4EqEtIjUmG8DgrMXjZg6h20h0jXS931ZlmJmtqnIe+3yWbaRt+a0wb1eaDfN27ZtmkYKtTdltnAcR9m96zrtiZFuG9myLMtnn+AeDodnewVmjVkec0pvv1apaZqiKOq6tgtlLym0A2XmjFlCIZFRM5ZpAOq6btt2diRHzHAlQlpgzB4hOHtZN2Z7Mhl94KreYzcE1WmGYdC9Zgtt69LPVVWp8djPU6aF9u72QkNZlmk7+CIeJg9xpNkqY46MMW3balvZjoM9ybzYuYwN1g1WjHkcRzvO9l5ZlslvObND6/pwJUJaYMweITh70WfM0rbT5qz8rzRV67q2u1KnfiMNVufIs4Xm6cV3QQcJypup2l7UI0wLbWO2De/ioxaWurKlIStT5UyroXs53QkrxqwNZen01sGVtt8nB1cipAXG7BGCs5fpM2b5YHuh2PNKi3mXMa84qEwi4biRUxjWmMuynLbdzzfm2ZFlS+VJwJUIaYExe4Tg7EUjps5n+6L9IFZ9yH62Ou3KNlan91KhdjVrR7Q9GkuPP1u41JW9y5i3LHE2a8z2L1o3Zrv33g6UmevKtiuvdcOYAa4GxuwRgrMXjZh6sPNumwz+kpeppFC6l+WFOp1iqe/7oihkJg3bWmYL8zx3CuVVPRnSZTeCp4WyYopUSZ1bWudd120ZvXw8Hg+Hw7PeLOO5NCbisjqeSwZ8yRotdV2rB+soOfPUvJZBahooeTNN+iTsJ+hFUchh7cFfRVEk93RZ4EqEtMCYPUJw9mLP/CUfpt429YYlt5gtny2cddAzd9/OmaPDPL28lNw7UStwJUJaYMweITh7IWLgA3QFaXGuXlnZfoWLL89+8zyQQMED6ArSghazRwjOEl9++eUPP/wwLSdi4INdunr9+vWrV6/8VQbgWTBmjxCcJd68efPZZ59NvZmIgQ826ur169cfffTRq1evvvvuO881AlgDY/YIwVlh1puJGPjgWV1hyRAVGLNHCM46U28mYuCDFV1hyRAhGLNHCM6zON5MxMAHs7rCkiFaMGaPEJwt2N7MIH/wgfN+BJYMkYMxe4TgbES9mYiBD1RXWDIkAcbsEYKzHfFmIgY+eHh4wJIhITBmjyx1rH311Ve6zVdffcU2NueH/R6QubW3rH4BZvlKvBqPj4+hYwApgTF7hOBs54cffrhOi1nXaEqXsixleu1xHGNYI3llVm1dbissDw8Pr169+uijj16/fh2qAkG+FxIFY/YIwdmIuPKbN2+8RqyqKlmcqq7ri6+XfDXatrWXv6zrOqz5NU1zOBxm/0tW7rpyfWYRXX333Xeh7JlUALvAmD1CcLagrmwmETtzAWB7JahhGOzGZQwNzdOYWl1w81tZCzJ43QRbV0HsmVQAu8CYPUJwnsV2ZXNRY5aFivXPvu9tM55dafHM5RevgHN7IRRFsX2JRh+LOa4cM0JjFq5sz6QC2AXG7BGCs47jyuY5Y27btq7rqqqKotBxT33fV1VVVZU61vF4bNs2z/O6rtu21fZclmWOqw3DkGWZHlw/G2PKspRj2u4+W1g9Yfcwa6HtTCuFUlWtSZ7nfd83TVOWpb3xbMd1VVUbH5xXVbXU7ax0XZfnuQStbduqquR+RT4L9sZlWdpxM09PviUg0RqzcDV7JhXALjBmjxCcFaaubJ4iJuYnGV8+SJvMtt66ruWzpv5xHIui0EPN2lXTNI49286hn/M8l2+0n5LOFspza/msLde+7/Wr1cZmC/WnmfcbvvZ9huP30x/lmOU6K93Oiv7Spmnkgx1bJ8593zvGnOe59j1EbszCFeyZVAC7wJg9QnCWmHVl81yLWUzathZpLuufdnNwpR1pt1mnxjyOo+M0S4XO7tLwlY3zPLcNdanQPmbXdfpbnPa3cmaLeSNN08gPsetjf69dbceYnUAlYcyCV3smFcAuMGaPEJwlvvjii6krmw3PmIdhKIoiyzKxZ3lyPDzh9DDbfzrPj4uikCNMjXnaBFwqlF36vtdvt79l2jqfFtrfbt9kLHnt+c+YNyKNZr05cOrjVHvFpxMyZkHs+bPPPgtVAQCDMXuF4OzFiZjTalRvOB6PkvHFp6cbGMtL1MLtNp+a2WxXtuM0K4Xa66sVM++/vKtN/NlC+5h1XS8Zoc11RmUXRWEHVtvQwooTO/+bnDHfagUgLTBmjxCcvaxHLMsycT67cVkUhXhG13X2TFjaM6yFTjvb3l0OmGWZ2Kf60DiOakizhcMwqDdrod0RrV80W9h1nR7TbgpXVbU0q9c57zFPB2otIUPAnH31Z9rfODXmsiylhnVda0jDEvxKDF4BSAuM2SMEZy/rEZPu4qZpnBFMwzDoMCWn3La3cRxlS2f3pmnEPOwjzG45W2iM6brOtp/j8Shf/WyhfGnbtnb7WH6m9JDPxkE9chiGXW+UjeO4/Wn09Nv7vm/b1o6ShHRaVY28j7ezTiD4lRi8ApAWGLNHCM5eiNhGxPZmB4jBlOC6Cl4BSItz5cICuis4q8DCszyQv8ADwXUVvAKQFrSYPUJw9kLEwAfBdRW8ApAWGLNHCM5eiBj4ILiuglcA0gJj9gjB2QsRAx8E11XwCkBaYMweITh7ueeI6ZvWDOm6OMF1FbwCkBYYs0cIzl58R0xebh6GIZLXeJRxHO0Xn+zJPS6CPTHZdJKyXdjviw/DUNd1/GtoBr8Sg1cA0gJj9gjB2YsTscuuw1gUhc7MtXGejavhzObRdd1l2832nCpL04tuP5R9D3Hm0a5D8CsxeAUgLTBmjxCcvTgRO2c9ZmcyDcdO7AkmgzM7A/ZlJ7O0fz7GfIcVgLTAmD1CcPbyrDHLVFNmMi/VdEKroiic6bRm+4ftbZw5ufq+n/Z4zxbO9o1v3312ZmxnHa0V7DWnl1gxZmfxD/MUh+mP0nm+thizc8xxHDW8G3/XBQl+JQavAKQFxuwRgrOXdWMuy7LrOlkOWX2raZqmaXSZKdlS2qAyfab2h8tM0c40mWoqtsHI0fq+txeWmC00T3cAXddpq1ceGEuhHnO2UJhtHDsrLa6Q5/mzz6SXjFkq3/e9ruoxDEOWZVJVCbjWRyYVr+t63Zg1UHJqjDHH41HOWtu2bdtmWbY0E7gngl+JwSsAaYExe4Tg7EUi1jRNVVWyarJ8EHNVA9Mm5jiOtic5qyNPm6Gyva5mYZ5bXcpuZ88W2ksu6p2BzCkthfphtnBaB7v+F+xvt9fHlKUnjTFLCzvaNyjiwbKYtFOof67cZ9ifD4fDdE7y6xD8SgxeAUgLjNkjBGcv6y1mzfK6ioPtN33fHw4He9+lBRvsNuvURaTJ6OwyW2jeX4+5LEutsLRinSbvbKFZWFB5pf4nsNRilmHqTdPID9F6OnvZreRnjVnue4Qsy2bXzbwywa/E4BWAtMCYPUJw9rJuzNKIbJrGboYuDRBzjM1xPulrNZcw5qXfIis5OhvMFmqX78Yjn8CsMbdtq01/O1xnGvNSzQOuzRz8SgxeAUgLjNkjBGcvTsSmLU7xD+2ItrtYzftdxOo0chB55Kn/q4aku4/jqAZjO429nPO00G4Bj+Mo9m9/kVZjttD+aU4otr/KPDugbLrN1Jjt8XFSJeeRge5l997Lgwb7yNMWsz7Xt88gxgywEYzZIwRnL+sRK8uybduqqoqi0CzfNI0YjLNSsrRN7dkwsiyTYWJ2C1WOJk+ydVCSDIaSfe3W+bTQGJPnuazorI+Eq6qSFrn99vBsoVLXte1hVVVtfxCbZdmzU3zUda2vccsz5uPx2HWdhE6iqmPr1FkltnIEGUwnY9zyPNeRYnI0e5CdjPOyAyWDv6Rb+7Lvpm8k+JUYvAKQFhizRwjOXlYi5rQynVbako1Ny7eUCLNv9Wx/1Wf2sCt2W5almJZj/L7x9PJSVHOrBb8Sg1cA0gJj9gjB2cuzLeau66SVdpMTSuug7tAVuTWCX4nBKwBpgTF7hODshYiBD4LrKngFIC0wZo8QnL0QMfBBcF0FrwCkBcbsEYKzFyIGPgiuq+AVgLTAmD1CcPZCxMAHwXUVvAKQFhizRwjOXojYOciAuJscFncmwXUVvAKQFufK5eXLlw+wwMuXLy9yku6Hh+X8NQzDOatA2tizbYzjaE+AtYS8iatzf16kGpfF/gnbJyfxx9L9wcpkbf5Y0dWdVADSArlARDj5y56M4ng8XnDqKOdQ9iTbS+i0z3Vdh5rEaml2Dmcpqq7rwrabx3E8HA5Lb0hfP3rBfTF4BSAtkAtEhJO/lhaxOJ9zjNk8rdNwqcpsZ2m9qWlkAs5/+SwYM8A6yAUiYosxD8PgzCo17V7WRSGn9jldu8IsGLNzTMeY7TpMqzTdfRxHe9JKp/7T3aXb3C7pum7W0mY7h+3VqdcZhuGcicbGcZxdXnO2yT4b/CsQ3BeDVwDSArlARKwbc5ZlMjGnTAEmhTLbs0xkLfZ2PB5lS5m/Wg8i8zzL1NDOjJ6OMctXOLNq213ZzgPdvu/l4FIij8NldzUhXTFCqreyu3la/EomnRZ/Ff/TFRWdKE2t0encXqGu62cXZByG4XA4SHjbtrVnBZfpx6uq0lrJ83gnpCvBvwLBfTF4BSAtkAtEhOQvWb+oqipZTqqqKmlrakLXNqLdMnMWLtTmqVqj7QfrLebpWpDmaQ2Moijs/mR7KWVtpM7uPruu4uzu8lk+OI3+2bbmkjEv9XufRlEUUhMNuHMzsR7SleBfgeC+GLwCkBbIBSJi4zNmu/O26zppt+V5PnU+Y3WAbzdmbZjKXnJY+eD0J8uXypZlWUqtZr9o1phndzfGyApOGxdpnp05fNatz0FtWCvpfMVKSNeDfwWC+2LwCkBaIBeIiL3GbL/pNOt85iRjnnUO26G1mbu05fRQS8Y83V2RTmb78fPs9uM4Tt+P8mF+chuhPeQYc0IVgLRALhARTv5ynpJOjVkf3Jonn5Ae7KW+aPkwjuP6M2ZdkNiugxpz0zTahSsrNOthxUTtg+tn28a0cHb3vu/VjJ2BXfpbliKjbH+VeXb01izSjtc/T+vKngb/CgT3xeAVgLRALhARK/lLhj6JX8qzXmNM13XizW3bVlUlg8JkdJWYjbTVdC8ZfyQtURmKLLZ0OBwcO8zzvOs6XRpZjmkPBNNHv9LnLAPNdHf5oqqq1J+6rpMhaVVVyYeV3aVtKkewW8zyA6cd187sK85e65RludEph2Fw/L6uax38pd+og7/0PsksBP9qBPfF4BWAtEAuEBGn5a9drxRvd6ztW84yHQi295izGy8dQdzdGKM3E1fjaiE9meC+GLwCkBbIBSLixvKXPXbsCsgXxTljaFiC6yp4BSAtkAtEBPkLfBBcV8ErAGmBXCAiyF/gg+C6Cl4BSAvkAhFB/gIfBNdV8ApAWiAXiAjyF/gguK6CVwDSArlARLC893Z+9rOfha7CDD/96U9DV2GG4CujP2DMsAfkApAen3zyyW9/+9tf//rXoSvyHl9//fXHH3/85Zdfhq5IdGDMsAvkApAY//jHPz766KMff/zxk08++etf/xq6Ov/P27dvpVaPj49v3rwJXZ24wJhhF8gFIDE++OADmUvkzZs3H3744ffffx+6RsYY88UXX/z73/82xnz77beffvpp6OrEBcYMu0AuACnx+9///o9//KP++ec///k3v/lNwPoI33zzzR/+8Af989WrV69fvw5XnejAmGEXyAUgGf7zn//88pe/fPv2rZb8+OOPv/jFL/71r38FrJV0X//vf//Tkrdv33788cc//PBDwFpFBcYMu0AuAMnwq1/96p///KdT+M0333z44YdB6iN8/fXXf/nLX5zCv/3tb4wCUzBm2AVyAUiDP/3pT7/73e9m/+vzzz///PPPr1wfQcd8Tf+LUWAKxgy7QC4ACfD9999/8MEHdnexzdu3bz/44IP//ve/V66VscZ8TWEUmIIxwy6QC0ACPPtm1N///vfrv9bsjPmawigwAWOGXSAXgNjRF5fXN7v+a82ffvrpt99+u7LBd99999FHH12tPtGCMcMukAtA7OiLy+tc/7XmZ0d4zY4Lu0MwZtgFcgGIGufF5XWu/1rzygivlXFh9wbGDLtALgDxMn1xeZ3rv9a8MsJrZVzYvYExwy6QC0C8zL64vM71X2ueHeH17LiwuwJjhl0gF4BIWXlxeZ0rv9Y8nedrOhfYnYMxwy6QC0Ck/OQnPzl5BeKf/OQn16yqMwqMMV8OGDPsArkAJElsuV5HgTHma0psJwsiB7kAJElsuV5HgTHma0psJwsiB7kAJEmEuf7Vq1evXr1izNeUCE8WxAxyAUiSCHP927dvf/7znzPma0qEJwtiBrkAJEmcuT7OWgWHsMAukAtAksSZ6+OsVXAIC+wCuQAkSZy5Ps5aBYewwC6QC0CSxJnr46xVcAgL7AK5ACRJnLk+zloFh7DALpALQJLEmevjrFVwCAvsArkAJEmcuf7ly5cnTyN6w7x8+TL0mYGUiPHaBoBneYjSmAHgfLi2AZIEYwa4Vbi2AZIEYwa4Vbi2AZIEYwa4Vbi2AZIEYwa4Vbi2AZIEYwa4Vbi2AZIEYwa4Vbi2AZIEYwa4Vbi2AZIEYwa4Vbi2AZIEYwa4Vbi2T+Tx8THU9H4AAMF5fHwMnYZvFoz5RB5or0BQUCCEBQX6g8ieCKKEsKBACAsK9AeRPRFECWFBgRAWFOgPInsiiBLCggIhLCjQH0T2RBAlhAUFQlhQoD+I7IkgSggLCoSwoEB/ENkTQZQQFhQIYUGB/iCyJ4IoISwoEMKCAv1BZE8EUUJYUCCEBQX6g8ieCKKEsKBACAsK9AeRPRFECWFBgRAWFOgPInsiiBLCggIhLCjQH0T2RBAlhAUFQlhQoD+I7IkgSggLCoSwoEB/ENkTQZQQFhQIYUGB/iCyJ4IoISwoEMKCAv1BZE8EUUJYUCCEBQX6g8ieCKKEsKBACAsK9AeRPRFECWFBgRAWFOgPInsiiBLCggIhLCjQH0T2RBAlhAUFQlhQoD+I7IkgSggLCoSwoEB/ENkTQZQQFhQIYUGB/iCyJ4IoISwoEMKCAv1BZE8EUUJYUCCEBQX648TIPj4+PsDd8/j4eFk5oivwAUIFH1xcV8qJxvzAvRJ4kAG6Ah8gVPCBPxlgzHA65DtIAoQKPsCYIUbId5AECBV8gDFDjJDvIAkQKvgAY4YYId9BEiBU8AHGDDFCvoMkQKjgg3s35up9xnE8+VBN05RleX6VjsdjVVVd18mfXddVVdU0zflHTgjyndA0jYpTJXEmoiiVel3XFzz4vXEbQq2qKs/zqqratr3yV0u6y/M8z3O7hATo68gn7nZ1XR4Oh77vjTFd1x0Oh5O9uSzLLMtO29e5HrIs00PleX44HE47bLrcRr67CIfD4Xg8juOYZVlVVacdxBHY4XDQQx0Oh5N1Czcg1DzP67o2xjRNo+54ZaqqskVIAsSY3xmzMeac3HcOzvWQZZlq8XA4oMsID3g19OyP43jyjaMjsMPhICXDMDw8PGDMJ5O6UKU1on/GY8wkQF9HPnG3CIxZOveKojDGNE0jt5OCdC1O+/2ks9Huyh7HcbYHRg6u6VW+SFowek8guhyGYRgGW6NyzKqqhmHQo5VleTwe67q262kWuiil/sMw1HWt/+VUVfqOyrIchsHp9rwaqee7C2JnJfvGcfas9X0vSlgXmCa7uq7t1slUYPqIZyrm7QKTujl/hhXYpUhdqEVR2FnreDzq59mzNgyDnGL7lDnykL5oKZH/cg5i61OYNeZpAjQT1e1NgPqj2rbV7bfX/2pgzO+MuWkaaZGI+A6HQ1EU8kEyWlEUkvscNRtjJCGqttq2zbLMKRSRtW3b9702ffq+b5pGNtb7gzzPsyyTe4KyLEWXekzZXbQin/M877quKAq5mZCmlWwpddbD1nXd932WZVo+rerxeJTDyjb245+rkXq+uyCzxjx71sRi27ZVJZsFgUmyG8cxz/OiKOQIswLTC0FkI8lrl8DKspTdVZ8xCOxSpC7UpT7C2bOWZVme55KX1nOdaEDUpRmsLMuyLPu+b9vWaQQ7xjybAGdVtysByk2qFErddtX/mmDM//+MLc/zsiz1Pq7v+4eHB8lNUijZzd7LuemTcymfsyzTNoemM/kKKczzXDewd9T/lQujKAoVcdu2srvzuFGeQZonjcoGmunsJ98qL6d1Pq2qef8xJC3mgMwa8+xZE1eWQhnLI59nBSZ7yWZqzFOB2ftqN9J2gUmKtH+LaimswC5F6kK1M4k42TAMS2fNFphdOJtAJKnKZ9mgLEvZXTKV3iaaOWOeJsAV1W1MgGLAZkOunq3/NcGYjSMRQc+xollJyLLM6TmxT7bcxAmagGa/yCzkza7rpAFk16QsS8mkzuCdaZ3ruhZxSwrWOksFpCdgpaortb0Oqee7CzJrzLNnTc+veT/TzQpM9Gwbs5kTmGPM+nmjwLRBo1XVGoYV2KVIXai2Mdd1rQ3N2bNmC0wLlxLItC0ufqkCWzfm2QQ4q7rtCbAoCh3mpsl8e/2vCca8w5jtDjf73kp3md7EOV9kP6uwW+fTvHk8HkUxWhPtqDHvi2aqS7txbyu+eMIW3GxVl8JyNVLPdxfEabtoNpyeNTtvSoNDPi/d+T08PMhzOPnfWYHNGvN2gU2/evpbkiZ1odoNSk0gS2dtyZhnE8jU2OzGzLPGPE2AS6rbngDrupauabuJtb3+1wRj3mrMwzA442Onu6gC9A0EY4wOpbETn4xBcL5rHEfZS+4ADoeDPLGT/z0cDtqPJKIRm5/q0n4ELrqUHaXTvixLe+zGbFWXwnI1Us93F8RuBKwLzOlp1BvHWYGJhodh0Mw1K7BZY94lMFtI9q0txnydA65jD/W3kxOd0RAAAAoESURBVN7sWZs15qUE4hjbtHu8bVt1xKkxm0kCXFGdFD67pbSe5cZR20gb639l7t2Y5cG+M5JLpgqRbg27jWs/k5v1ctWWjPMSJ7YPLh0m0sFi7ysbS6EMspDOlmEYpCZN08htoA6WEWVL75MIS7eUb5e+ShmRKyNgpdoyIFavxmlV5aZB9gr1Xn/q+e5SyPmVZo19mz8rMHkqJufdkbQtMOkklH+ld1H+nBWY6KfruuPxqFvuEpgMHxPNi5xiENiluAGhalqzxyXMnrXD4aDvqmjanEpRRjWrGvWLtDdFhCTy0wlG9F5wKQHOqm57AjRPd67SS6R3rtvrf03u3ZhPwBkIIClJPkyfqcweYbZ84/iX7cMQnC2lG0f/tIc8bP/2q3ED+e4KOGdNfHGX6qZ4Etj1h89ch5sR6qw8tp+17QnkzFRzsj7tLk9jjJj6pWp1cTDmc5G3TXTwfczYd6wBe2m2cDP57mpIC7goitkHZtchIYFdCoSaEKpM+6linGDMECPkO0gChAo+wJghRsh3kAQIFXyAMUOMkO8gCRAq+ABjhhgh30ESIFTwAcYMMUK+gyRAqOADjBlihHwHSYBQwQcYM8QI+Q6SAKGCD6Iz5hcvXjzA3fPixYvLyhFdgQ8QKvjg4rpSaDHD6VxcBugKfIBQwQf+ZIAxw+mQ7yAJECr4AGOGGCHfQRIgVPABxgwxQr6DJECo4AOMGWKEfAdJgFDBBxgzxAj5DpIAoYIPMGaIEfIdJAFCBR9gzBAj5DtIAoQKPsCYIUbId5AECBV8gDFDjJDvIAkQKvgAY4YYId9BEiBU8AHGDDFCvoMkQKjgA4wZYoR8B0mAUMEHGDPECPkOkgChgg8wZogR8h0kAUIFH2DMECPkO0gChAo+wJghRsh3kAQIFXyAMUOMkO8gCRAq+ABjhhgh30ESIFTwAcYMMUK+gyRAqOADjBlihHwHSYBQwQfRGfOLFy8e4O558eLFZeWIrsAHCBV8cHFdKbSY4XQuLgN0BT5AqOADfzLAmOF0yHeQBAgVfIAx3xRt2+q/SUO+i4qb0dXFQahRIRLtui50Rc4lMWO+YMTtQ43j2DTNpY4cirIsj8ejMWYcx7IsQ1fHjOO49F/Pnscr5zt0tcIt6eriXFmofd9f6oucWHVdJ2c5XZqm0R9VFEXQuhgTWQJ8d+QTd1uuUN/3WZadWh/3UHmey+dxHPu+PxwO67scj8csy5qm6fu+KIoYMpRN27a2B9R1Hfa2cRzHh4eH2TxiB3+Ja+Y7dLXCjenq4lxTqCKVi3yLHavj8TgMQ5Zlz7p+WZZlWQ7DUFXV9UO9jnPXKJUMW5+oEuC7I5+42/sVcoJ7QTU4h3o2gRpjbO1mWbZyQ+SPpRbYNDLBr5xhGJb+K7gxoyuHO9HVxbkZoW4x5qqqtD5FUQTpDVr60qIonAsneKM5qgT47sgn7pZOAl2JuyeOx+NsBIZhmLa0pkpdwYcZrBwTY7ZBV7s4R1cX52aEuteYq6qq63rvl57ZW74kVDMXmaZptt86xCbU9IxZxJHnuf7s6glNItIz0zRNVVVFUeigFenuqKqqaZpnE6hsWVWVnTTls9P5qRWwdSAldV3LTxBJye5SvfXdZUf7l3ZdV1VVlmVt2zrDcGY7GO2ar1NV1bP+0XVdnufiGW3bVlUl15h8tq9Y+YF1XTvHXAn+lOvnO3R1D7q6ONcX6lR+UiJIJE8Q6tSYp/rR0yGd6tMrZUWozu4qWqf+uvsuoc7eQfZ9X23rzd4i1GEY8jyX7x2GoSgKDbWEtK5rvaWOMAG+O/KJuz08GGMkG5ZlmWWZfJBzo3lHg24/S5hNdsa6PcnzXG/Z1hPo7JZZltV17TwIrKrKHnEg9bRbFVpnu3p6zNndjXVBdl1nXzCzZ3Q2VzpCX2dLK02vkKZp5MM4jtpfZH8WtoR0CU/5Dl3dua4uzvWFOis/+WBb0V6hOsY8qx+x+Wpy/7pRqHb1VFpit1Jot3F3CXXWg3eNOdgi1LqupXr2oE77K0649peI1JiV6Q2jfLDPxPF4lDM6q0X9PI6j3Z54Noj6WXsX5fhN09iZwt6yeuresY9m58qVi8reXcrrup52hsye0TNbNhtpmkaqZ19d9vc6I1PsIKwHf0qoHkJ0ZXN7uro4Abuy7c9d14l+dPu9QnWMeVY/ck+2cpx1oc4asy0n20p3CfXMFvNGxnGUb1dX7vve/t6yLO0YRpUA3x35xN12JlDpYdAbupUE6vQTridQSZrCtLXkHKfve91S7olmr5+lBDrdXZBePqeenp4FbkRCbd/VrtzM2iFdD/6U4MaMrswt6urixGDMeZ7LfYxtRXuFOjXmqX60s0S/cWnL2XouGXPTNIOF7rhdqLPlu54xb0RavforHO93dBtVAnx35BN3e79CTmSn57goCo3FegI1k8RnH3maQPWzakW16zRB7Dwlupz9IqdHdGV3u6RtW3uQhR7N6XuZnmkfSaooCrtVp20dYaVlY1aDP8V3vkNX96mrixNKqPpZHtBKyboxm9VYTY15qh81ZrHMlS1nv8iunjYutX9YEPmdINTrjMqWbgm9KdE2tNbNrkNUCfDdkU/cbdtrfNqHoLqUR+tN08jz+SzLtJWge8kGxpi6rrMss7vLnCA2TSPHH8dRZaHatfsl7KaVbqmZpWkaPbKc1L7vZVyA1GR2d7uHxOlOlFu2vu8dFZ7zvqk8ytqypX1B6r5aeecbnZCuBH9KqNdD0dVt6+riXHmCkan8bG+o61qjsVeojjHP6kfGLun28r/bhSrylqc2eZ6rFLX9rYMMThDqOe8xbxeqmchPH7vYD8tntwybAN8d+cTdliskMzaI2uyewGEYpDPEPM2MY585ey/ZWDKsntdxHOVowzDYJ3scx7Zt9b5MjmmPu7M37rrOCbTUyrmlkkdB5v1bwqXdu65r23babThbaKxctvflegnRxo2noyT6vneqJFMWSLjsTtRp8Je4Zr5DV8I96OriXPkOclZ+8hSgfxqZv7KlmYuVHVXnLDj66fteT6jIe2lLsyBUGa48jqPz3pSca2f3vULVu2djzK6JenYJdbqlnSiECBPguyOfuNvNTRVr37r6Rs76DUwDyRTEz4KuYgChPsv1hcpc2WtHPnG329Kl3Itd/0Y+dch366CrSECo6yDU08CYIUbId5AECBV8gDFDjJDvIAkQKvgAY4YYId9BEiBU8AHGDDFCvoMkQKjgA4wZYoR8B0mAUMEH0Rnzy5cvH+Duefny5WXliK7ABwgVfHBxXSnc9wEAAEQExgwAABARGDMAAEBEYMwAAAARgTEDAABEBMYMAAAQERgzAABARGDMAAAAEYExAwAARATGDAAAEBEYMwAAQERgzAAAABGBMQMAAEQExgwAABARGDMAAEBEYMwAAAAR8X9+Pz+DSPjldAAAAABJRU5ErkJggg==" alt="" />
源代码
抽象处理者角色类
public abstract class Handler {
/**
* 持有下一个处理请求的对象
*/
protected Handler successor = null;
/**
* 取值方法
*/
public Handler getSuccessor() {
return successor;
}
/**
* 设置下一个处理请求的对象
*/
public void setSuccessor(Handler successor) {
this.successor = successor;
}
/**
* 处理聚餐费用的申请
* @param user 申请人
* @param fee 申请的钱数
* @return 成功或失败的具体通知
*/
public abstract String handleFeeRequest(String user , double fee);
}
具体处理者角色
public class ProjectManager extends Handler { @Override
public String handleFeeRequest(String user, double fee) { String str = "";
//项目经理权限比较小,只能在500以内
if(fee < 500)
{
//为了测试,简单点,只同意张三的请求
if("张三".equals(user))
{
str = "成功:项目经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}else
{
//其他人一律不同意
str = "失败:项目经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}
}else
{
//超过500,继续传递给级别更高的人处理
if(getSuccessor() != null)
{
return getSuccessor().handleFeeRequest(user, fee);
}
}
return str;
} }
public class DeptManager extends Handler { @Override
public String handleFeeRequest(String user, double fee) { String str = "";
//部门经理的权限只能在1000以内
if(fee < 1000)
{
//为了测试,简单点,只同意张三的请求
if("张三".equals(user))
{
str = "成功:部门经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}else
{
//其他人一律不同意
str = "失败:部门经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}
}else
{
//超过1000,继续传递给级别更高的人处理
if(getSuccessor() != null)
{
return getSuccessor().handleFeeRequest(user, fee);
}
}
return str;
} }
public class GeneralManager extends Handler { @Override
public String handleFeeRequest(String user, double fee) { String str = "";
//总经理的权限很大,只要请求到了这里,他都可以处理
if(fee >= 1000)
{
//为了测试,简单点,只同意张三的请求
if("张三".equals(user))
{
str = "成功:总经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}else
{
//其他人一律不同意
str = "失败:总经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}
}else
{
//如果还有后继的处理对象,继续传递
if(getSuccessor() != null)
{
return getSuccessor().handleFeeRequest(user, fee);
}
}
return str;
} }
客户端类
public class Client { public static void main(String[] args) {
//先要组装责任链
Handler h1 = new GeneralManager();
Handler h2 = new DeptManager();
Handler h3 = new ProjectManager();
h3.setSuccessor(h2);
h2.setSuccessor(h1); //开始测试
String test1 = h3.handleFeeRequest("张三", 300);
System.out.println("test1 = " + test1);
String test2 = h3.handleFeeRequest("李四", 300);
System.out.println("test2 = " + test2);
System.out.println("---------------------------------------"); String test3 = h3.handleFeeRequest("张三", 700);
System.out.println("test3 = " + test3);
String test4 = h3.handleFeeRequest("李四", 700);
System.out.println("test4 = " + test4);
System.out.println("---------------------------------------"); String test5 = h3.handleFeeRequest("张三", 1500);
System.out.println("test5 = " + test5);
String test6 = h3.handleFeeRequest("李四", 1500);
System.out.println("test6 = " + test6);
} }
运行结果如下所示:
aaarticlea/png;base64,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" alt="" />
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。
责任链模式在Tomcat中的应用
众所周知Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。
public class TestFilter implements Filter{ public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response);
} public void destroy() {
} public void init(FilterConfig filterConfig) throws ServletException {
} }
使用DEBUG模式所看到的结果如下
aaarticlea/png;base64,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" alt="" />
其实在真正执行到TestFilter类之前,会经过很多Tomcat内部的类。顺带提一下其实Tomcat的容器设置也是责任链模式,注意被红色方框所圈中的类,从Engine到Host再到Context一直到Wrapper都是通过一个链传递请求。被绿色方框所圈中的地方有一个名为ApplicationFilterChain的类,ApplicationFilterChain类所扮演的就是抽象处理者角色,而具体处理者角色由各个Filter扮演。
第一个疑问是ApplicationFilterChain将所有的Filter存放在哪里?
答案是保存在ApplicationFilterChain类中的一个ApplicationFilterConfig对象的数组中。
/**
* Filters.
*/
private ApplicationFilterConfig[] filters =
new ApplicationFilterConfig[0];
那ApplicationFilterConfig对象又是什么呢?
ApplicationFilterConfig是一个Filter容器。以下是ApplicationFilterConfig类的声明:
/**
* Implementation of a <code>javax.servlet.FilterConfig</code> useful in
* managing the filter instances instantiated when a web application
* is first started.
*
* @author Craig R. McClanahan
* @version $Id: ApplicationFilterConfig.java 1201569 2011-11-14 01:36:07Z kkolinko $
*/
当一个web应用首次启动时ApplicationFilterConfig会自动实例化,它会从该web应用的web.xml文件中读取配置的Filter的信息,然后装进该容器。
刚刚看到在ApplicationFilterChain类中所创建的ApplicationFilterConfig数组长度为零,那它是在什么时候被重新赋值的呢?
private ApplicationFilterConfig[] filters =
new ApplicationFilterConfig[0];
是在调用ApplicationFilterChain类的addFilter()方法时。
/**
* The int which gives the current number of filters in the chain.
*/
private int n = 0;
public static final int INCREMENT = 10;
void addFilter(ApplicationFilterConfig filterConfig) { // Prevent the same filter being added multiple times
for(ApplicationFilterConfig filter:filters)
if(filter==filterConfig)
return; if (n == filters.length) {
ApplicationFilterConfig[] newFilters =
new ApplicationFilterConfig[n + INCREMENT];
System.arraycopy(filters, 0, newFilters, 0, n);
filters = newFilters;
}
filters[n++] = filterConfig; }
变量n用来记录当前过滤器链里面拥有的过滤器数目,默认情况下n等于0,ApplicationFilterConfig对象数组的长度也等于0,所以当第一次调用addFilter()方法时,if (n ==filters.length)的条件成立,ApplicationFilterConfig数组长度被改变。之后filters[n++] = filterConfig;将变量filterConfig放入ApplicationFilterConfig数组中并将当前过滤器链里面拥有的过滤器数目+1。
那ApplicationFilterChain的addFilter()方法又是在什么地方被调用的呢?
是在ApplicationFilterFactory类的createFilterChain()方法中。
1 public ApplicationFilterChain createFilterChain
2 (ServletRequest request, Wrapper wrapper, Servlet servlet) {
3
4 // get the dispatcher type
5 DispatcherType dispatcher = null;
6 if (request.getAttribute(DISPATCHER_TYPE_ATTR) != null) {
7 dispatcher = (DispatcherType) request.getAttribute(DISPATCHER_TYPE_ATTR);
8 }
9 String requestPath = null;
10 Object attribute = request.getAttribute(DISPATCHER_REQUEST_PATH_ATTR);
11
12 if (attribute != null){
13 requestPath = attribute.toString();
14 }
15
16 // If there is no servlet to execute, return null
17 if (servlet == null)
18 return (null);
19
20 boolean comet = false;
21
22 // Create and initialize a filter chain object
23 ApplicationFilterChain filterChain = null;
24 if (request instanceof Request) {
25 Request req = (Request) request;
26 comet = req.isComet();
27 if (Globals.IS_SECURITY_ENABLED) {
28 // Security: Do not recycle
29 filterChain = new ApplicationFilterChain();
30 if (comet) {
31 req.setFilterChain(filterChain);
32 }
33 } else {
34 filterChain = (ApplicationFilterChain) req.getFilterChain();
35 if (filterChain == null) {
36 filterChain = new ApplicationFilterChain();
37 req.setFilterChain(filterChain);
38 }
39 }
40 } else {
41 // Request dispatcher in use
42 filterChain = new ApplicationFilterChain();
43 }
44
45 filterChain.setServlet(servlet);
46
47 filterChain.setSupport
48 (((StandardWrapper)wrapper).getInstanceSupport());
49
50 // Acquire the filter mappings for this Context
51 StandardContext context = (StandardContext) wrapper.getParent();
52 FilterMap filterMaps[] = context.findFilterMaps();
53
54 // If there are no filter mappings, we are done
55 if ((filterMaps == null) || (filterMaps.length == 0))
56 return (filterChain);
57
58 // Acquire the information we will need to match filter mappings
59 String servletName = wrapper.getName();
60
61 // Add the relevant path-mapped filters to this filter chain
62 for (int i = 0; i < filterMaps.length; i++) {
63 if (!matchDispatcher(filterMaps[i] ,dispatcher)) {
64 continue;
65 }
66 if (!matchFiltersURL(filterMaps[i], requestPath))
67 continue;
68 ApplicationFilterConfig filterConfig = (ApplicationFilterConfig)
69 context.findFilterConfig(filterMaps[i].getFilterName());
70 if (filterConfig == null) {
71 // FIXME - log configuration problem
72 continue;
73 }
74 boolean isCometFilter = false;
75 if (comet) {
76 try {
77 isCometFilter = filterConfig.getFilter() instanceof CometFilter;
78 } catch (Exception e) {
79 // Note: The try catch is there because getFilter has a lot of
80 // declared exceptions. However, the filter is allocated much
81 // earlier
82 Throwable t = ExceptionUtils.unwrapInvocationTargetException(e);
83 ExceptionUtils.handleThrowable(t);
84 }
85 if (isCometFilter) {
86 filterChain.addFilter(filterConfig);
87 }
88 } else {
89 filterChain.addFilter(filterConfig);
90 }
91 }
92
93 // Add filters that match on servlet name second
94 for (int i = 0; i < filterMaps.length; i++) {
95 if (!matchDispatcher(filterMaps[i] ,dispatcher)) {
96 continue;
97 }
98 if (!matchFiltersServlet(filterMaps[i], servletName))
99 continue;
100 ApplicationFilterConfig filterConfig = (ApplicationFilterConfig)
101 context.findFilterConfig(filterMaps[i].getFilterName());
102 if (filterConfig == null) {
103 // FIXME - log configuration problem
104 continue;
105 }
106 boolean isCometFilter = false;
107 if (comet) {
108 try {
109 isCometFilter = filterConfig.getFilter() instanceof CometFilter;
110 } catch (Exception e) {
111 // Note: The try catch is there because getFilter has a lot of
112 // declared exceptions. However, the filter is allocated much
113 // earlier
114 }
115 if (isCometFilter) {
116 filterChain.addFilter(filterConfig);
117 }
118 } else {
119 filterChain.addFilter(filterConfig);
120 }
121 }
122
123 // Return the completed filter chain
124 return (filterChain);
125
126 }
可以将如上代码分为两段,51行之前为第一段,51行之后为第二段。
第一段的主要目的是创建ApplicationFilterChain对象以及一些参数设置。
第二段的主要目的是从上下文中获取所有Filter信息,之后使用for循环遍历并调用filterChain.addFilter(filterConfig);将filterConfig放入ApplicationFilterChain对象的ApplicationFilterConfig数组中。
那ApplicationFilterFactory类的createFilterChain()方法又是在什么地方被调用的呢?
是在StandardWrapperValue类的invoke()方法中被调用的。
aaarticlea/png;base64,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" alt="" />
由于invoke()方法较长,所以将很多地方省略。
public final void invoke(Request request, Response response)
throws IOException, ServletException {
...省略中间代码
// Create the filter chain for this request
ApplicationFilterFactory factory =
ApplicationFilterFactory.getInstance();
ApplicationFilterChain filterChain =
factory.createFilterChain(request, wrapper, servlet);
...省略中间代码
filterChain.doFilter(request.getRequest(), response.getResponse());
...省略中间代码
}
那正常的流程应该是这样的:
在StandardWrapperValue类的invoke()方法中调用ApplicationFilterChai类的createFilterChain()方法———>在ApplicationFilterChai类的createFilterChain()方法中调用ApplicationFilterChain类的addFilter()方法———>在ApplicationFilterChain类的addFilter()方法中给ApplicationFilterConfig数组赋值。
aaarticlea/png;base64,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" alt="" />
根据上面的代码可以看出StandardWrapperValue类的invoke()方法在执行完createFilterChain()方法后,会继续执行ApplicationFilterChain类的doFilter()方法,然后在doFilter()方法中会调用internalDoFilter()方法。
以下是internalDoFilter()方法的部分代码
// Call the next filter if there is one
if (pos < n) {
//拿到下一个Filter,将指针向下移动一位
//pos它来标识当前ApplicationFilterChain(当前过滤器链)执行到哪个过滤器
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter = null;
try {
//获取当前指向的Filter的实例
filter = filterConfig.getFilter();
support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT,
filter, request, response); if (request.isAsyncSupported() && "false".equalsIgnoreCase(
filterConfig.getFilterDef().getAsyncSupported())) {
request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,
Boolean.FALSE);
}
if( Globals.IS_SECURITY_ENABLED ) {
final ServletRequest req = request;
final ServletResponse res = response;
Principal principal =
((HttpServletRequest) req).getUserPrincipal(); Object[] args = new Object[]{req, res, this};
SecurityUtil.doAsPrivilege
("doFilter", filter, classType, args, principal); } else {
//调用Filter的doFilter()方法
filter.doFilter(request, response, this);
}
这里的filter.doFilter(request, response, this);就是调用我们前面创建的TestFilter中的doFilter()方法。而TestFilter中的doFilter()方法会继续调用chain.doFilter(request, response);方法,而这个chain其实就是ApplicationFilterChain,所以调用过程又回到了上面调用dofilter和调用internalDoFilter方法,这样执行直到里面的过滤器全部执行。
如果定义两个过滤器,则Debug结果如下:
aaarticlea/png;base64,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" alt="" />
转自:https://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html
【转】《JAVA与模式》之责任链模式的更多相关文章
- Java设计模式十九——责任链模式
责任链模式 老李的苦恼 每个人在出生的时候,都早已在暗中被标好了三六九等. 老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事.在他们的心中,谁当老爷都没有区别, ...
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- Python的组合模式与责任链模式编程示例
Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...
- Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式
模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请 ...
- Java设计模式系列之责任链模式
责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...
- 《java设计模式》之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java常见设计模式之责任链模式
原文地址: http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开 ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- Java设计模式学习记录-责任链模式
前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...
随机推荐
- Data truncation: Data too long for column
是字符集问题引起的,用show full fields from + 表名就可以看出你的列的编码格式把它改成GBK或者GB2312.uTF-8.如果还不行的话,把你表的编码格式也改成上面的编码格式,我 ...
- 【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
介绍 晚上无聊的时候,我做了一个測试题,測试题的大体意思是:删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录. 比如: I have a map with duplicate val ...
- Python 的错误和异常处理
语法错误 Python 的语法错误或者称之为解析错,如下: >>> while True print('Hello world') File "<stdin>& ...
- MATLABR 2016 b 安装教程
1.下载相应的 MATLABR 2016 b 版本如下: 主要是下面三个文件,其中, Matlab 2016b Win64 Crack.rar 是破解文件.另两个为安装包.(本软件在win8/10上不 ...
- ios 中尝试多次请求
-(void)tryRun { tryTimes++; id obj = [ASODataManager getAppleAccount]; if (obj) { __block FirstViewC ...
- 02-3设置第一启动项--进入BIOS设置USB方式启动
设置USB方式启动 https://zhinan.sogou.com/guide/detail/?id=1610014869 如何设置电脑从U盘启动呢?今天小编教大家如何进入BIOS设置USB方式启动 ...
- springboot学习(三) springboot文件配置
1.简介 springboot没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是在pom.xml中引入模块化的Starter POMs,其中各个模块都有自己的默认配置,所以如果不是特 ...
- [原创]JAVA号码工具类:实现手机固话号码判断与区号截取
工具类说明 该工具类主要是用于判断号码的类型,如果是手机类型,则返回号码前7位,便于后面继续判断号码归属地:如果是固话类型,则截取固话的区号,同样也是为了后面判断号码的归属地. 在获取到这些信息之后, ...
- 实时竞价(RTB) 介绍(基础篇)
前言: 说到"实时竞价"大家一定都不陌生,那么为何如今实时竞价发展这么迅猛,当然这个主要得益于总体移动互联网环境的成熟,以及中国本地移动广告市场出现爆发式增长.那么到底什么是实时竞 ...
- PyTorch在64位Windows下的Conda包(转载)
PyTorch在64位Windows下的Conda包 昨天发了一篇PyTorch在64位Windows下的编译过程的文章,有朋友觉得能不能发个包,这样就不用折腾了.于是,这个包就诞生了.感谢@晴天14 ...