行为型设计模式之责任链模式
定义
为请求创建一个接受此次请求对象的链类型
行为型适用场景
为请求创建一个接受此次请求对象的链优点请求的发送者和接受者(请求的处理)的解耦可以动态组合缺点责任链太长或者处理时间太长影响性能责任链有可能过多举例
J2EE中Servlet的Filter过滤器就是采用这用责任链模式,一个过滤器过滤完可以继续交给下一个过滤器继续别的过滤逻辑。最终交给Servlet处理。ShowCode
设想这样一个场景,你的一个采购合同需要审批,根据金额大小,从主管、副董事长、董事长、董事会每一层级有不同的审批权限,对应审批金额(当然还可以有中间其他的层级经理、副经理等等),50万主任审批就OK了,100万需要更高级的责任人审批。包装需要处理的数据authorpengbincreate201951410:36PMpublicclassPurchaseRequest{publicdoubleamount;publicintnumber;publicStringpurpose;}
责任人父类authorpengbincreate201951410:30PMpublicabstractclassApprover{下一个责任方protectedApproverapprover;设置下一个责任方paramapproverpublicvoidsetNextApprover(Approverapprover){this。approverapprover;}处理审批的方法paramrequest需要处理操作的数据入参publicabstractvoidprocessRequest(PurchaseRequestrequest);}
主任责任方子类authorpengbincreate201951410:48PMpublicclassDirectorApporverextendsApprover{publicvoidprocessRequest(PurchaseRequestrequest){if(request。amount50000){System。out。println(主任审批);}elseif(null!super。approver){super。approver。processRequest(request);}}}
副董事长责任方子类authorpengbincreate201951410:47PMpublicclassVicePresidentApproverextendsApprover{publicvoidprocessRequest(PurchaseRequestrequest){if(request。amount100000request。amount50000){System。out。println(副董事长审批);}elseif(null!super。approver){super。approver。processRequest(request);}}}
董事长责任方子类authorpengbincreate201951410:45PMpublicclassPresidentApproverextendsApprover{publicvoidprocessRequest(PurchaseRequestrequest){if(request。amount500000request。amount100000){System。out。println(董事长审批);}elseif(null!super。approver){super。approver。processRequest(request);}}}
董事会讨论authorpengbincreate201951410:41PMpublicclassCongressApproverextendsApprover{publicvoidprocessRequest(PurchaseRequestrequest){if(request。amount500000){System。out。println(开会讨论);}elseif(null!super。approver){super。approver。processRequest(request);}}}
publicclassTest{publicstaticvoidmain(String〔〕args){PurchaseRequestrequestnewPurchaseRequest();request。amount500000;初始化所有参与的责任方ApproverdirectornewDirectorApporver();ApprovervpnewVicePresidentApprover();ApproverpresidentnewPresidentApprover();ApprovercongressnewCongressApprover();设置责任链director。setNextApprover(vp);vp。setNextApprover(president);president。setNextApprover(congress);最下层的责任方开始处理director。processRequest(request);}}