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

工作中常用的设计模式——适配模式

时间:2023-04-01 21:23:46 Java

涓€鑸敤浜庝笟鍔″紑鍙戯紝涓嶅鏄撴湁澶ч噺浣跨敤璁捐妯″紡鐨勫満鏅€傝繖閲屾€荤粨涓€涓嬩笟鍔″紑鍙戜腑姣旇緝甯哥敤鐨勮璁℃ā寮忋€傝瑷€褰撶劧鏄疛ava锛屽熀浜嶴pring妗嗘灦銆?閫傞厤鍣ㄦā寮忥紙AdapterPattern锛夊綋鐜版湁鐨勬帴鍙e拰鏈嶅姟涓庢垜浠渶瑕佺殑鍜岀洰鏍囩殑鎺ュ彛涓嶅吋瀹规椂锛屾垜浠渶瑕佷娇鐢ㄤ竴瀹氱殑鏂规硶浣夸袱鑰呭吋瀹瑰拰閫傞厤銆備竴涓父瑙佺殑渚嬪瓙鏄鐢ㄧ數婧愶紙鍥芥爣锛夋槸220V锛岃€屾墜鏈虹殑鏍囧噯杈撳叆涓€鑸槸5V銆傝繖鏃跺€欐垜浠氨闇€瑕佷竴涓€傞厤鍣ㄥ皢220V杞?V浣跨敤銆侫dapter妯″紡涓€鑸湁3涓綔鐢細Target锛氱洰鏍囨帴鍙daptee锛氶渶瑕侀€傞厤锛堟敼閫狅級鐨勭被Adapter锛欰dapter锛堝皢Adaptee杞寲涓篢arget锛夊嚭鐜扮殑鍦烘櫙鍏跺疄寰堝锛屼絾鍏跺疄瀹屽叏鏄寜鐓ч€傞厤鍣ㄦā寮忓啓鐨勪唬鐮佺殑鍦烘櫙鍙兘涓嶅銆傚浜庣畝鍗曠殑涓氬姟鍦烘櫙锛岄€傞厤鍜屽吋瀹逛唬鐮佺洿鎺ュ拰涓氬姟浠g爜娣峰湪涓€璧枫€傛病鏈夊彇鍑烘潵澶勭悊銆傛湭鏉ュぇ閮ㄥ垎涓氬姟浠g爜鍙兘涓嶄細鎵╁睍锛岃繃搴﹁璁′細闄嶄綆鍙鎬э紝澧炲姞浠g爜鐨勫鏉傚害銆傞€傞厤鍣ㄦā寮忎竴鑸垎涓虹被閫傞厤鍣ㄥ拰瀵硅薄閫傞厤鍣ㄣ€傚浜庣被閫傞厤鍣紝浣跨敤缁ф壙锛歝lassAdapterextendsAdapteeimplementsTarget锛涘浜庡璞¢€傞厤鍣紝浣跨敤缁勫悎銆傝繖绉嶆儏鍐电◢寰伒娲讳竴浜涖€傛瘯绔熷ぇ瀹堕兘鎺ㄨ崘澶氱粍鍚堝皯缁ф壙銆傚綋瀛︾敓鍙戠敓绾︿細銆佺粨璇剧瓑浜嬩欢鏃讹紝鎴戜滑闇€瑕佸悓姝ヤ竴浜涙暟鎹埌澶栭儴CRM绯荤粺銆傝绋嬪垎涓虹彮鍨嬶細1v1銆佸皬鐝拰澶х彮銆備笉鍚岀殑鐝骇绫诲瀷鏈変笉鍚岀殑璇剧▼鏁版嵁銆備簨浠朵笂鎶ユ椂锛屽苟涓嶆槸鍏ㄩ噺鏁版嵁锛屾湁浜涙暟鎹渶瑕佹秷璐硅€呮寜闇€鏌ヨ銆傛瘮濡傝鍙枫€佸悕绉般€侀瀹氫笂璇炬椂闂寸瓑銆備笉鍚岃鍨嬬殑璇剧▼鐢变笁涓笉鍚岀殑FeignClients锛圓daptee锛夋湇鍔★紝鎴戜滑瑕佺殑鏄煡璇㈣绋嬬浉鍏充俊鎭紙Target锛夈€備负浜嗘ā鎷熸湇鍔℃彁渚涜€咃紝鎴戜滑Mock浜嗕互涓嬫湇鍔°€侤Data@BuilderpublicclassOneClass{//璇剧▼缂栧彿privateStringlessonNo;//璇剧▼鍚嶇ОprivateStringlessonName;//鍏朵粬淇℃伅privateStringone;}@Data@BuilderpublicclassSmallClass{//璇剧▼缂栧彿privateStringlessonNo;//璇剧▼鍚嶇ОprivateStringlessonName;//鍏朵粬淇℃伅privateStringsmall;}@Data@BuilderpublicclassBigClass{//璇剧▼缂栧彿privateStringlessonNo;//璇剧▼鍚嶇ОprivateStringlessonName;//鍏朵粬淇℃伅privateStringbig;}publicinterfaceRemoteClassClient{defaultOneClassgetOne(){returnOneClass.builder().lessonNo("one").lessonName("1V1").build();}defaultSmallClassgetSmall(){returnSmallClass.builder().lessonNo("small").lessonName("smallclass").build();}defaultBigClassgetBig(){returnBigClass.builder().lessonNo("big").lessonName("bigclass").build();}}鍏叡绫籖emoteClassClientImpl瀹炵幇RemoteClassClientt{}璇ユ湇鍔$敱RemoteClassClient缁熶竴鎻愪緵锛屽澶栨彁渚涘悇绫荤被鍨婥lassService(Target鐩爣鎺ュ彛锛岀洰鏍囧璞?鐨勬煡璇㈡湇鍔?***璇剧▼淇℃伅*/@Data@BuilderpublicclassClassInfoBO{//璇剧▼绫诲瀷1锛?v12锛歴mall3锛歜igprivateString绫诲瀷锛?/绫籌DprivateStringclassId;//璇剧▼缂栧彿privateStringlessonNo;//璇剧▼鍚嶇ОprivateStringlessonName;}/***鐩爣鎺ュ彛*/publicinterfaceClassService{booleanmatch(StringclassType);ClassInfoBOgetClassInfo(StringclassId);}鎺ヤ笅鏉ユ垜浠渶瑕佸嚑涓€傞厤鍣ㄦ潵瀹屾垚閫傞厤銆?.1瀵硅薄閫傞厤鍣∣neClassAdapter/***1v1閫傞厤鍣?/@Component@RequiredArgsConstructorpublicclassOneClassAdapterimplementsClassService{privatestaticfinalStringTYPE="1";绉佹湁鏈€缁圧emoteClassClient绫诲鎴风锛汙Overridepublicbooleanmatch(StringclassType){returnTYPE.equals(classType);}@OverridepublicClassInfoBOgetClassInfo(StringclassId){finalOneClassone=classClient.getOne();杩斿洖ClassInfoBO.builder().type("1").classId(classId).lessonNo(one.getLessonNo()).lessonName(one.getLessonName()).build();}}SmallClassAdapter/***灏忕彮璇鹃€傞厤鍣?/@Component@RequiredArgsConstructorpublicclassSmallClassAdapterimplementsClassService{privatestaticfinalStringTYPE="2";绉佹湁鏈€缁圧emoteClassClient绫诲鎴风锛汙Overridepublicbooleanmatch(StringclassType){杩斿洖TYPE.equals锛堢被绫诲瀷锛夛紱}@OverridepublicClassInfoBOgetClassInfo(StringclassId){finalSmallClasssmall=classClient.getSmall();杩斿洖ClassInfoBO.builder().type("2").classId(classId).lessonNo(small.getLessonNo()).lessonName(small.getLessonName()).build();}}BigClassAdapter/***澶х彮璇鹃€傞厤鍣?/@Component@RequiredArgsConstructorpublicclassBigClassAdapterimplementsClassService{privatestaticfinalStringTYPE="3";绉佹湁鏈€缁圧emoteClassClient绫诲鎴风锛汙Overridepublicbooleanmatch(StringclassType){returnTYPE.equals(classType);}@OverridepublicClassInfoBOgetClassInfo(StringclassId){finalBigClassbig=classClient.getBig();杩斿洖ClassInfoBO.builder().type("3").classId(classId).lessonNo(big.getLessonNo()).lessonName(big.get璇剧▼鍚嶇О()).build();}}鑷虫锛岄€傞厤鍣ㄥ氨瀹屾垚浜嗭紝鍙互鏍规嵁鍏蜂綋鍦烘櫙閫夋嫨涓嶅悓鐨勯€傞厤鍣ㄩ€傞厤褰撳墠鍦烘櫙銆傚彟涓€涓€傞厤鍣ㄥ伐鍘傜被銆侰lassAdapterFactory/***璇剧▼淇℃伅閫傞厤鍣ㄥ伐鍘?/@Service@RequiredArgsConstructorpublicclassClassAdapterFactory{privatefinalListclassServiceList;ClassServicegetAdapter(StringclassType){returnclassServiceList.stream().filter(cs->cs.match(classType)).findFirst().orElse(null);}}1.2绫婚€傞厤鍣ㄥ彧鏄竴涓緥瀛愩€傝閫傞厤鍣ㄤ笉濡傚璞¢€傞厤鍣ㄧ伒娲汇€?***灏忕被閫傞厤鍣紙绫婚€傞厤鍣級*/@ComponentpublicclassSmallClassAdapter2extendsRemoteClassClientImplimplementsClassService{privatestaticfinalStringTYPE="2";@Overridepublicbooleanmatch(StringclassType){returnTYPE.equals(classType);}@OverridepublicClassInfoBOgetClassInfo(StringclassId){finalSmallClasssmall=super.getSmall();杩斿洖ClassInfoBO.builder().type("2").classId(classId).lessonNo(small.getLessonNo()).lessonName(small.getLessonName()).build();}}鍙互鐪嬪埌鎴戜滑閫氳繃缁ф壙璁㏒mallClassAdapter2鍏峰浜哛emoteClassClientImpl鏌ヨ璇剧▼淇℃伅鐨勮兘鍔涖€傚畠涓嶴mallClassAdapter娌℃湁澶ぇ鍖哄埆銆?.3鍗曟祴@SpringBootTestclassClassServiceTest{@AutowiredprivateClassAdapterFactoryadapterFactory;@TestvoidtestOne(){StringclassType="1";StringclassId="11111111";Optional.ofNullable(adapterFactory.getAdapter(classType)).ifPresent(ad->{finalClassInfoBOclassInfo=ad.getClassInfo(classId);assertEquals("one",classInfo.getLessonNo());});}@TestvoidtestSmall(){StringclassType="2";StringclassId="22222222";Optional.ofNullable(adapterFactory.getAdapter(classType)).ifPresent(ad->{finalClassInfoBOclassInfo=ad.getClassInfo(classId);assertEquals("small",classInfo.getLessonNo());});}@TestvoidtestBig(){StringclassType="3";StringclassId="33333333";Optional.ofNullable(adapterFactory.getAdapter(classType)).ifPresent(ad->{finalClassInfoBOclassInfo=ad.getClassInfo(classId);assertEquals("big",classInfo.getLessonNo());});浠€涔堬紵鎴戣寰楁渶閲嶈鐨勬槸鑳藉甫鏉ヤ竴涓В鍐虫柟妗堬紙锛熻璁℃ā寮忓綋鐒舵槸杩欐牱鐨勶級锛屽叾娆★紝瀹冩彁渚涗簡涓€浜涘満鏅殑瑙勮寖銆傚鏋滄垜浠病鏈夎繖涓璁℃ā寮忥紝鎴戜滑涔熷彲浠ユ湁涓€涓В鍐虫柟妗堬紝浣嗘槸鍏蜂綋鐨勫疄鐜板彲鑳戒細寰堝鎬紙馃榾褰撶劧璁捐妯″紡鏈潵灏辨槸浠庡悇绉嶅鎬殑涓滆タ涓彁鐐煎嚭鏉ョ殑锛夈€傝璁℃ā寮忎笉鏄伒涓瑰鑽€傞伩鍏嶆互鐢ㄣ€傚畠涓庣瓥鐣ユā寮忔湁浣曚笉鍚岋紵鍙槸浠庡疄鐜版柟娉曪紙routine锛夈€備笉鑳借娌℃湁鍖哄埆锛屽畬鍏ㄤ竴鏍枫€傛兂鎯崇湅锛孉daptee鍦ㄦ敾鐣ユā寮忎笅涓嶄竴瀹氬瓨鍦ㄣ€傚叾鐩殑鏄皢涓嶅悓绛栫暐鐨勫叿浣撳疄鐜板拰璋冪敤鍒嗗紑銆侫dapter妯″紡鐨勯噸鐐规槸Adaptee->Target閫傞厤銆傚皝闈㈠浘鐗囨潵婧愶細https://refactoring.guru/desi...echo'5Y6f5Yib5paH56ugOiDmjpjph5Eo5L2g5oCO5LmI5Zad5aW26Iy25ZWKWzkyMzI0NTQ5NzU1NTA4MF0pL+aAneWQpihscGUyMzQp'|base64-d