当前位置: 首页 > 后端技术 > Java

【简单易懂的设计模式】责任链模式

时间:2023-04-01 18:28:47 Java

琚悇澶у巶鍟嗛噰鐢ㄣ€傛垜鏄€滆榧犵帇锛圞angarooEmperor锛夆€濓紝涓嶆槸鎴戝紵寮熺殑寮熷紵銆備竴鍙皬灏忕殑缃戠粶铚楃墰鈥滅摐鈥濅細闄潃澶у涓€姝ユ寰€涓婄埇锛屾€绘湁涓€澶╀細鏈変竴鐗囧睘浜庢垜浠殑澶╃┖銆傚叧娉ㄦ垜锛屾瘡澶╄繘姝ヤ竴浜跨偣鉂椻潡鉂楀墠瑷€锛堝拷鎮狅級涔嬪墠鐪嬩簡涓€浜涘紑婧愭鏋剁殑婧愮爜锛屽彂鐜拌矗浠婚摼妯″瀷灏卞儚涓€涓獂xx锛堣繖閲岃鐨勪笉濂斤紝澶т浆浠府鎴戣ˉ涓婅瘎璁哄尯0.0瀛楁牱锛夐€傜敤浜庡悇澶ф鏋躲€傚苟涓旀湁寰堝鏂规硶鍙互瀹炵幇瀹冦€備互涓嬪唴瀹瑰€煎緱闃呰鍜屽涔犮€傞潰璇曠殑鏃跺€欙紝璁╀綘鍜岄潰璇曞畼鏈夋洿澶氱殑鑺辨牱锛岃棰嗗鍦ㄥ伐浣滀腑瀵逛綘鍒洰鐩哥湅銆傞鍏堢悊瑙h矗浠婚摼锛氫富瑕佺敤浜庢祦绋嬫帶鍒跺拰澶勭悊锛屾瘮濡傝鍋囩殑瀹℃壒娴佺▼锛屽伐鍘傞噷鐨勬祦姘寸嚎锛宒evops鐨勬祦姘寸嚎锛堟祦姘寸嚎锛夌瓑绛夛紝閮藉彲浠ョ湅鍋氭槸璐d换閾俱€備粙缁嶏紙搴熻瘽锛夎矗浠婚摼锛圕hainofResponsibility锛夋ā寮忕殑瀹氫箟锛氫负浜嗛伩鍏嶈姹傚彂閫佽€呬笌澶氫釜璇锋眰澶勭悊鍣ㄨ€﹀悎锛屾墍鏈夌殑璇锋眰澶勭悊鍣ㄩ€氳繃涓婁竴涓璞¤浣忎笅涓€涓璞$殑寮曠敤銆傝繛鎴愪竴鏉¢摼锛涘綋璇锋眰鍙戠敓鏃讹紝璇锋眰鍙互娌跨潃杩欐潯閾句紶閫掞紝鐩村埌涓€涓璞″鐞嗗畠銆傚湪璐d换閾炬ā寮忎笅锛屽鎴风鍙渶瑕佸悜璐d换閾惧彂閫佽姹傦紝涓嶉渶瑕佸叧蹇冭姹傜殑澶勭悊缁嗚妭鍜岃姹傜殑浼犻€掕繃绋嬶紝璇锋眰浼氳嚜鍔ㄤ紶閫掋€傚洜姝わ紝璐d换閾惧皢璇锋眰鐨勫彂閫佽€呬笌璇锋眰鐨勫鐞嗚€呭垎绂汇€傝矗浠婚摼妯″紡鏄竴绉嶅璞?琛屼负妯″紡锛屽叾涓昏浼樼偣濡備笅銆傚噺灏戝璞′箣闂寸殑鑰﹀悎銆傝繖绉嶆ā寮忎娇寰椾竴涓璞′笉闇€瑕佺煡閬撳摢涓璞″鐞嗗畠鐨勮姹傚拰閾剧殑缁撴瀯锛屽苟涓斿彂閫佽€呭拰鎺ユ敹鑰呬笉闇€瑕佸郊姝ゆ湁鏄庣‘鐨勪俊鎭€傚寮虹殑绯荤粺鍙墿灞曟€с€傚彲浠ユ牴鎹渶瑕佸鍔犳柊鐨勮姹傚鐞嗙被锛屾弧瓒冲紑闂師鍒欍€傚寮轰簡涓哄璞″垎閰嶈亴璐g殑鐏垫椿鎬с€傚綋宸ヤ綔娴佸彂鐢熷彉鍖栨椂锛岄摼涓殑鎴愬憳鍙互鍔ㄦ€佸彉鍖栨垨椤哄簭璋冩暣锛岃亴璐d篃鍙互鍔ㄦ€佸鍔犳垨鍒犻櫎銆傝矗浠婚摼绠€鍖栦簡瀵硅薄涔嬮棿鐨勮繛鎺ャ€傛瘡涓璞″彧闇€瑕佷繚鐣欏鍏跺悗缁ц€呯殑寮曠敤锛岃€屼笉鏄鎵€鏈夊叾浠栧鐞嗙▼搴忕殑寮曠敤锛岃繖閬垮厤浜嗕娇鐢ㄥぇ閲忕殑if鎴杋f...else璇彞銆傚叡鍚岃矗浠汇€傛瘡涓被鍙渶瑕佸鐞嗗畠搴旇澶勭悊鐨勫伐浣滐紝鎶婁笉搴旇澶勭悊鐨勫伐浣滀氦缁欎笅涓€涓璞″幓瀹屾垚锛屾槑纭瘡涓被鐨勮亴璐h寖鍥达紝绗﹀悎绫荤殑鍗曚竴鑱岃矗鍘熷垯銆傚畠鐨勪富瑕佺己鐐瑰涓嬨€備笉鑳戒繚璇佹瘡涓姹傞兘浼氬緱鍒板鐞嗐€傜敱浜庤姹傛病鏈夋槑纭殑鎺ユ敹鑰咃紝鍥犳鏃犳硶淇濊瘉瀹冧細琚鐞嗭紝骞朵笖璇锋眰鍙兘浼氫竴鐩存部鐫€閾惧悜涓嬩紶閫掕€屼笉琚鐞嗐€備笌杈冮暱鐨勮矗浠婚摼鐩告瘮锛岃姹傜殑澶勭悊鍙兘娑夊強澶氫釜澶勭悊瀵硅薄锛岀郴缁熸€ц兘浼氬彈鍒颁竴瀹氬奖鍝嶃€傝矗浠婚摼寤虹珛鐨勫悎鐞嗘€т緷璧栦簬瀹㈡埛绔紝澧炲姞浜嗗鎴风鐨勫鏉傛€э紝骞朵笖鍙兘鍥犺矗浠婚摼鐨勮缃笉姝g‘鑰屽鑷寸郴缁熼敊璇紝濡傚惊鐜皟鐢ㄣ€傚紩鐢ㄨ嚜锛歨ttp://c.biancheng.net/view/1...鐩殑锛氬皢璇锋眰鑰呬笌澶勭悊鍣ㄨВ鑰︼紝閾惧紡璋冪敤锛屽彲浠ョ伒娲绘敼鍙樺鐞嗛『搴忥紝绗﹀悎寮€闂師鍒欙紝鍏锋湁鍙墿灞曟€у己銆備粠瀹為檯鍑哄彂锛堜汉鎬у寲锛夛細鍏徃闇€瑕佸疄鐜颁竴涓祦绋嬪鎵瑰姛鑳斤紝姣斿璇峰亣娴佺▼瀹℃壒銆佸姞鐝鎵广€佹姤閿€瀹℃壒绛夈€備笁瑕佺礌锛氳矗浠婚摼锛堝鎵规祦绋嬶級淇℃伅锛堝鎵瑰唴瀹癸級鍦ㄥ鐞嗚€咃紙瀹℃壒浜猴級閾句腑浼犻€掓敞锛氭娊璞″鐞嗚绱犲彲鎵╁睍浠g爜绀轰緥浠g爜鍦板潃锛歨ttps://gitee.com/kangarookin銆?.瀹氫箟瀹℃壒鑰呯殑鎶借薄绫伙紝鈥滆璁℃ā寮忕殑鎯敤濂楄矾锛屽皢鍙兘鏈夊涓疄鐜扮殑绫诲畾涔変负鎶借薄锛屾彁楂樼▼搴忕殑鍙墿灞曟€с€傗€濆湪鏈緥涓紝瀹℃壒浜哄彲鑳藉寘鎷琀R銆佺粡鐞嗐€佹妧鏈€荤洃銆佸洟闃熺瓑绛夈€傘€傘€?***璐d换閾句腑鐨勮妭鐐癸紙娴佺▼涓殑瀹℃壒浜猴級*@param*杩欓噷锛屽鎵逛俊鎭瀹氫箟涓洪€氱敤鐨勶紝鏇寸伒娲?/@DatapublicabstractclassApplyHandler{protectedApplyHandlernext=null;//瀹氫箟瀹℃壒浜哄湪鏁翠釜璐d换閾句腑鐨勫鎵归『搴弍rotectedIntegerorder锛涘彈淇濇姢鐨勫瓧绗︿覆鍚嶇О锛沺ublicvoidapply(Objectobj){if(null!=next){next.transform(obj);}else{System.out.println("----------------------------");绯荤粺銆俹ut.println("缁撴潫");}}@SuppressWarnings("unchecked")publicvoidtransform(Objectobj){//灏嗕紶鍏ョ殑瀵硅薄杞崲涓烘硾鍨嬪畾涔夌被鍨婽param=(T)obj;鍙ユ焺锛堝弬鏁帮級锛泒//鍏蜂綋鐨勫鎵归€昏緫protectedabstractvoidhandle(Tparam);publicApplyHandler(Integerorder){this.order=order;}鍏紑鐢宠Handler(){}}鍒涘缓涓€涓娊璞¤矗浠婚摼锛堝鎵规祦绋嬶級骞跺垱寤轰竴涓粯璁ら摼锛堥粯璁ゅ鎵规祦绋嬶級锛屼负鍚庨潰鍒涘缓鐨勫叾浠栫被鍨嬬殑瀹℃壒娴佺▼鎻愪緵涓€涓彲鎵╁睍鐨勫紑鏀俱€?***鑱岃矗閾剧鐞嗗櫒*绠$悊閾惧ご鍜岄摼灏撅紝浠ュ強閾剧殑澧炲垹鏀规煡*/@DatapublicabstractclassApplyChain{publicApplyHandlerfirst=newApplyHandler(){@Overridepublicvoidhandle(Objectobj){//绗竴涓妭鐐逛笉鍙備笌澶勭悊锛岀洿鎺pplyapply(obj);}};绉佷汉ApplyHandlerend=first;//璐d换閾剧殑璋冪敤鍏ュ彛protectedabstractvoidexc(Objectobj);//鍦ㄦ湯灏炬坊鍔犱竴涓妭鐐筽ublicvoidaddLast(ApplyHandlerhandler){end.setNext(handler);缁撴潫=澶勭悊绋嬪簭锛泒//...鍏朵粬鎿嶄綔璐d换閾剧殑鏂规硶姝ゅ鐪佺暐}/***榛樿瀹℃壒娴佺▼*/classDefaultApplyChainextendsApplyChain{@Overrideprotectedvoidexc(Objectobj){//浣跨敤閾惧ご鍚姩璋冪敤鏁翠釜璐d换閾維ystem.out.println("---------------start------------");棣栧厛.transform(obj);}}瀹氫箟涓嶅悓鐨勫疄闄呭鎵硅€厎@Overrideprotectedvoidhandle(LeaveApplyMsgapplyMsg){System.out.println("TeamLeaderApproval");//瀹℃壒瀹屾垚鍚庯紝缁х画鐢宠apply(applyMsg);}}classManagerHandlerextendsApplyHandler{publicManagerHandler(Integerorder){super(order);}@Overrideprotectedvoidhandle(LeaveApplyMsgapplyMsg){System.out.println("ManagerApproval");//瀹℃壒瀹屾垚鍚庯紝缁х画鐢宠apply(applyMsg);}}classHrHandlerextendsApplyHandler{publicHrHandler(Integerorder){super(order);}@Overrideprotectedvoidhandle(LeaveApplyMsgapplyMsg){System.out.println("HRapproval");//瀹℃壒瀹屾垚鍚庣户缁敵璇穉pply(applyMsg);}}瀹氫箟璇峰亣淇℃伅/***璇峰亣瀹℃壒淇℃伅*/@DatapublicclassLeaveApplyMsg{privateStringmsg;绉佷汉鏁存暟绾у埆锛涚鏈夊瓧绗︿覆鍚嶇О锛沺rivateIntegerhour;}妯℃嫙鐢ㄦ埛鎻愪氦璇峰亣鐢宠publicclassChainClient{publicstaticvoidmain(String[]args){//鍒楄〃鍙互浠庢暟鎹簱涓幏鍙朙ist>applyHandlerList=newArrayList<>();ApplyHandlerhr=newHrHandler(3);ApplyHandlergl=newGroupLeaderHandler(1);ApplyHandlerm=newManagerHandler(2);applyHandlerList.add(m);applyHandlerList.add(gl);applyHandlerList.add(hr);//鏍规嵁璁㈠崟瀛楁鎺掑簭List>collect=applyHandlerList.stream().sorted(Comparator.comparing(ApplyHandler::getOrder)).collect(Collectors.toList());ApplyChainapplyChain=newDefaultApplyChain();//寰幆缁勮鍒拌矗浠婚摼涓璮or(ApplyHandlerapplyHandler:collect){applyChain.addLast(applyHandler);}//鍦ㄥ疄闄呭満鏅腑锛屼笂闈㈢殑浠g爜鍙互鏀惧埌绯荤粺鍚姩鏃跺垵濮嬪寲鏁版嵁鐨勬柟娉曚腑锛宻pring鏈夊緢澶氳繖鏍风殑鎵╁睍鐐癸紝澶у鍙互鑷鐞嗚В//涓嬮潰鐨勪唬鐮佺浉褰撲簬锛岀敤鎴烽€夋嫨鎵瑰噯鍦ㄥ墠绔緭鍏ワ紙瀵瑰簲涓嶅悓鐨勪俊鎭級锛岀劧鍚庣偣鍑籄pply//鍚庣瑙﹀彂applyChain.exc(applyMsg);杩欎釜鏂规硶寮€濮嬫墽琛屾暣涓矗浠婚摼LeaveApplyMsgapplyMsg=newLeaveApplyMsg();applyMsg.setMsg("璇峰亣");applyMsg.setName("lhm");applyMsg.setLevel(1);applyChain.exc(applyMsg);鍙傝€僺entinelchainofresponsibility锛堝崟鍚戦摼琛級鐨勭敤娉曪紝褰撶劧浣犱篃鍙互鐢╨ist鏉ュ仛銆傚紑婧愭鏋朵腑璐d换閾剧殑浣跨敤spring-cloud-gateway涓殑璇锋眰杩囨护浣跨敤鐨勬槸璐d换閾炬ā寮忥紝鍏ュ彛鍦‵ilteringWebHandler绫讳腑銆傜楸肩綉鍏充腑鍚勪釜鎻掍欢鐨勮皟鐢ㄤ篃鏄噰鐢ㄨ矗浠婚摼妯″紡锛屽叆鍙e湪绁為奔WebHandler绫讳腑銆俿entinel涓瘡涓猻lot鐨勮皟鐢ㄩ兘閲囩敤璐d换閾炬ā寮忋€傚浜庡叆鍙o紝鎮ㄥ彲浠ユ鏌tSph#asyncEntryWithPriorityInternal鏂规硶涓殑浠ヤ笅浠g爜琛屻€傛湁鍏磋叮鐨勫彲浠ュ幓鐪嬬湅璐d换閾炬ā寮忓湪杩欎簺妗嗘灦涓槸濡備綍瀹炵幇鐨勩€傜湅瀹岀ず渚嬩唬鐮佸氨寰堝鏄撶悊瑙e浣曚娇鐢╯entinel銆俫ateway鍜宻henyu閮芥槸缃戝叧銆備粬浠互绫讳技鐨勬柟寮忓疄鏂借矗浠婚摼銆備粬浠娇鐢ㄥ搷搴斿紡缂栫▼銆傛垜浠彲浠ョ湅鐪嬪疄鐜版€濊矾銆備笅闈㈡槸spring-cloud-gateway鐨勫疄鐜皃rivatestaticclassDefaultGatewayFilterChainimplementsGatewayFilterChain{//鎺у埗褰撳墠浣跨敤鍒楄〃涓殑鍝釜filter澶勭悊privatefinalintindex;//瀛樺偍鎵€鏈夎繃婊ゅ櫒锛堝嵆鏈疄鐜颁娇鐢ㄥ垪琛ㄤ綔涓鸿矗浠婚摼锛塸rivatefinalListfilters;DefaultGatewayFilterChain(Listfilters){this.filters=filters;杩欎釜.index=0;}privateDefaultGatewayFilterChain(DefaultGatewayFilterChainparent,intindex){this.filters=parent.get);this.index=绱㈠紩锛泒publicListgetFilters(){杩斿洖杩囨护鍣紱}//閾惧紡璋冪敤鍏ュ彛@OverridepublicMonofilter(ServerWebExchangeexchange){returnMono.defer(()->{//鍒ゆ柇璋冪敤鏄惁瀹屾垚if(this.index