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

《设计模式面试小炒》策略与工厂模式替换复杂ifelse

时间:2023-04-02 10:06:55 Java

銆婅璁℃ā寮忛潰璇曞皬鐐掋€嬩笟鍔″満鏅腑鐨勭瓥鐣ヤ笌宸ュ巶妯″紡鏇挎崲澶嶆潅ifelse鎴戞槸鑳栧摜锛屼竴涓笉涓撲笟鐨勯潰璇曞畼锛佹垜鏄洤鍥э紝涓€涓鍦ㄧН鏋佹壘宸ヤ綔鐨勮彍楦燂紒鍥у洤璇达細灏忕櫧闈㈣瘯鏈€澶х殑鎭愭儳灏辨槸闈㈣瘯瀹樼殑鐭ヨ瘑鐐瑰お绗肩粺锛屼笉鑳藉揩閫熷畾浣嶉噸鐐癸紒锛侊紒鏈湡涓昏闈㈣瘯鑰冪偣鏄浣曞湪涓氬姟鍦烘櫙涓娇鐢ㄨ璁℃ā寮忔浛浠e鏉傜殑ifelse锛烿IP绫诲瀷importjava.util.Objects;/***@author:娆㈣繋鍏虫敞閲庣尓璐﹀彿锛氬洤閭h偉浜?@date:2021/12/16*@email:jiongmefeishi@163.com**浼氬憳type*/publicenumVIPEnums{GOLD(1,"閲戝崱浼氬憳"),STAR(2,"閽荤煶浼氬憳"),SPORTS(3,"杩愬姩浼氬憳"),FUN_VIP(4,"FUN浼氬憳");绉佹湁鏈€缁堜唬鐮侊紱绉佷汉鏈€缁堝瓧绗︿覆鎻忚堪锛沄IPEnums(intcode,Stringdesc){this.code=code;杩欎釜.desc=desc;}publicintgetCode(){杩斿洖浠g爜锛泒publicStringgetDesc(){杩斿洖鎻忚堪锛泒publicstaticVIPEnumsgetByCode(Integercode){for(VIPEnumss:VIPEnums.values()){if(Objects.equals(s.getCode(),code)){returns;}}杩斿洖绌哄€硷紱}}VIP瀹炰綋/***@浣滆€咃細娆㈣繋鍏虫敞鍠備俊閲庣尓璐﹀彿锛氬洤濂借偉鐨勪笢瑗?@date:2021/12/16*@email:jiongmeifeishi@163.com**vip*/publicclassVIP{privateVIPEnumsvipType;//TODOVIP鍏朵粬灞炴€d,name...publicVIP(){}publicVIP(VIPEnumsvipType){this.vipType=vipType;}publicVIPEnumsgetVipType(){returnvipType;}publicvoidsetVipType(VIPEnumsvipType){this.vipType=vipType;}}if-elsemode//if-elsemodepublicclassApp{publicstaticvoidmain(String[]args){//閲戠墝浼氬憳VIPvip=newVIP(VIPEnums.GOLD);if(vip.getVipType().getCode()==VIPEnums.GOLD.getCode()){//TODO榛勯噾浼氬憳绂忓埄}elseif(vip.getVipType().getCode()==VIPEnums.STAR.getCode()){//TODO鏄熼捇浼氬憳鏉冪泭}elseif(vip.getVipType().getCode()==VIPEnums.SPORTS.getCode()){//TODO浣撹偛浼氬憳鏉冪泭}elseif(vip.getVipType().getCode()==VIPEnums.FUN_VIP.getCode()){//TODOFUN浼氬憳绂忓埄}else{//TODO鍏朵粬浼氬憳...}}}鏀荤暐妯″紡VIP鏀荤暐鐣岄潰/***@author:Huan娆㈣繋鍏虫敞灏忕尓璐﹀彿锛氬洤鑲ヨ偉浜?@date:2021/12/16*@email:jiongmefeishi@163.com*VIP鏀荤暐鐣岄潰*/publicinterfaceVIPStrategy{//VIP鎷ユ湁鐨勬潈鐩妚oidequity();}绛栫暐鎺ュ彛鍏蜂綋瀹炵幇绫?閲戠墝浼氬憳/***@浣滆€咃細娆㈣繋鍏虫敞閲庣尓鍙凤細鍥ц偉鑲ヤ簨*@date:2021/12/16*@email:jiongmefeishi@163.com**strategy鎺ュ彛鍏蜂綋瀹炵幇绫?閲戠墝浼氬憳*/publicclassGoldVIPStrategyImplimplementsVIPStrategy{@Overridepublicvoidequity(){//TODO鍏蜂綋閲戠墝浼氬憳鎷ユ湁鐨勬潈鐩妢}绛栫暐鎺ュ彛鍏蜂綋瀹炵幇绫?鏄熼捇浼氬憳/***@author:娆㈣繋鍏虫敞閲庣尓鍙凤細鍥ц偉鑲ヤ簨*@date:2021/12/16*@email:jiongmefeishi@163.com**绛栫暐鎺ュ彛鍏蜂綋瀹炵幇绫?鏄熼捇浼氬憳*/publicclassStarVIPStrategyImplimplementsVIPStrategy{@Overridepublicvoidequity(){//TODO鏄熼捇浼氬憳鍏蜂綋鏉冪泭}}绛栫暐鎺ュ彛鍏蜂綋瀹炵幇class-sportsmembers/***@author:娆㈣繋鍠傜尓鍙?鍥уソ鑳栧晩*@date:2021/12/16*@email:jiongmefeishi@163.com**绛栫暐鎺ュ彛鐨勫叿浣撳疄鐜扮被-浣撹偛浼氬憳*/publicclassSportsVIPStrategyImplimplementsVIPStrategy{@Overridepublicvoidequity(){//TODO浣撹偛浼氬憳鍏蜂綋鏉冪泭}}绛栫暐鎺ュ彛鍏蜂綋瀹炵幇绫?FUN浼氬憳/***@浣滆€咃細娆㈣繋鍏虫敞閲庣尓鍙凤細鍥уソ鑲ョ殑涓滆タ*@date:2021/12/16*@鐢靛瓙閭欢锛歫iongmefeishi@163.com**绛栫暐鎺ュ彛鐨勫叿浣撳疄鐜扮被-FUN浼氬憳*/publicclassFunVIPStrategyImplimplementsVIPStrategy{@Overridepublicvoidequity(){//FUN浼氬憳TODO鍏蜂綋鏉冪泭}}绛栫暐涓婁笅鏂囩被/***@浣滆€咃細娆㈣繋鍏虫敞鍠傜尓璐﹀彿锛氬洤鑲栬偉浜?@date:2021/12/16*@email:jiongmefeishi@163.com**绛栫暐涓婁笅鏂囩被锛坴ip绛栫暐鎺ュ彛鎸佹湁鑰咃級*/鍏叡绫籚IPStrategyContext{绉佷汉VIPStrategyvipStrategy;//璁剧疆VIP绛栫暐publicvoidsetVipStrategy(VIPStrategyvipStrategy){this.vipStrategy=vipStrategy;}//鎵цVIP鏉冪泭publicvoidhandle(){if(vipStrategy!=null){vipStrategy.equity();}}}绛栫暐宸ュ巶/***@浣滆€咃細娆㈣繋鍏虫敞閲庣尓璐﹀彿锛氬洤鑲ヨ偉浜?@date:2021/12/16*@email:jiongmefeishi@163.com**VIP绛栫暐宸ュ巶*/publicclassVIPStrategyFactory{privateVIPStrategyFactory(){}publicstaticVIPStrategygetVipStrategy(VIPvip){VIPStrategyvipStrategy=null;if(vip.getVipType().getCode()==VIPEnums.GOLD.getCode()){//榛勯噾浼氬憳绛栫暐褰撳墠绫籿ipStrategy=newGoldVIPStrategyImpl();}elseif(vip.getVipType().getCode()==VIPEnums.STAR.getCode()){//鏄熺骇VIP绛栫暐瀹炵幇绫籿ipStrategy=newStarVIPStrategyImpl();}elseif(vip.getVipType().getCode()==VIPEnums.SPORTS.getCode()){//浣撹偛浼氬憳绛栫暐瀹炵幇绫籿ipStrategy=newSportsVIPStrategyImpl();}elseif(vip.getVipType().getCode()==VIPEnums.FUN_VIP.getCode()){//FUN浼氬憳绛栫暐瀹炵幇绫籿ipStrategy=newFunVIPStrategyImpl();}else{//鍏朵粬鎴愬憳...}returnvipStrategy;}}妯℃嫙浼氬憳鐧诲綍棰嗗彇绂忓埄/***@浣滆€咃細娆㈣繋鍏虫敞鍠備俊閲庣尓璐﹀彿锛氬洤閭h偉浜?@date:2021/12/16*@email:jiongmefeishi@163.com**妯℃嫙浼氬憳鐧诲綍鑾峰彇绂忓埄*/publicclassTestStrategy{publicstaticvoidmain(String[]args){//榛勯噾浼氬憳VIPvip=newVIP(VIPEnums.GOLD);//绛栫暐涓婁笅鏂囷紝鎵ц鑰匳IPStrategyContextcontext=newVIPStrategyContext();//鏍规嵁浼氬憳绫诲瀷锛岃幏鍙栦細鍛樺叿浣撶瓥鐣ワ紝鑾峰彇榛勯噾浼氬憳StrategyVIPSt璐圭巼绛栫暐=VIPStrategyFactory.getVipStrategy(vip);//缁戝畾鍒版墽琛屽櫒context.setVipStrategy(strategy);//鎵ц榛勯噾浼氬憳绛栫暐锛岄粍閲戞潈鐩奵ontext.handle();}}鎴戜滑鐭ラ亾锛岀瓥鐣ユā寮忔湰韬殑璁捐鐩殑灏辨槸涓轰簡灏佽涓€绯诲垪鐨勭畻娉曘€傝繖浜涚畻娉曞叿鏈夊叡鎬э紝鍙互鐩镐簰鏇夸唬銆傜畻娉曠殑鍙樺寲鐙珛浜庝娇鐢ㄥ畠鐨勫鎴风銆傚鎴风涓嶉渶瑕佷簡瑙g浉鍏崇畻娉曠殑鍏蜂綋瀹炵幇銆傚鎴风鍙緷璧栫瓥鐣ユ帴鍙o紝閫氳繃浣跨敤绛栫暐妯″紡鍜屽伐鍘傛ā寮忕殑缁撳悎锛屾槸涓嶆槸鎰熻鍙橀珮澶т笂浜嗭紵馃槆褰撶劧锛屾渶閲嶈鐨勬槸绋嬪簭鐨勬墿灞曟洿鏂逛究锛屾洿绗﹀悎寮€闂師鍒欙紝瀵规墿灞曞紑鏀撅紝瀵逛慨鏀瑰叧闂€傛棤璁哄鍔犲灏戞柊绫诲瀷鐨勪細鍛橈紝澶у鍙渶缁ф壙绛栫暐鎺ュ彛鍗冲彲瀹炵幇鏂颁細鍛樺簲鏈夌殑鏉冪泭銆傛敞鎰忥紝铏界劧鏈夊埄浜庢墿灞曪紝浣嗙瓥鐣ユā寮忕殑缂虹偣涔熷緢鏄庢樉銆傜瓥鐣ュ伐鍘傚湪鍒涘缓鍏蜂綋鐨勭瓥鐣ュ疄鐜扮被鐨勬椂鍊欙紝杩樻槸鍐欎簡寰堝if-else鏉ュ仛鍒ゆ柇銆傚鍥撅紝鏈夊皬浼欎即璇磋繖涓拰娌$敤绛栫暐妯″紡鍜屽伐鍘傛ā寮忓ソ鍍忓緢鍍忥紵锛燂紵鎻愬彇涓€涓柟娉曟垨鑰呭皝瑁呮垚涓€涓璞¤皟鐢ㄤ笉鏄洿绠€鍗曞悧锛燂紵锛熸帴涓嬫潵璇翠竴涓嬪浣曚紭鍖栫瓥鐣ュ伐鍘傘€傞鍏堬紝鎴戜滑鐨勫伐鍘傛槸鏍规嵁褰撳墠浼犲叆鐢ㄦ埛鐨勪細鍛樼被鍨嬨€傚垽鏂悗杩斿洖瀵瑰簲鐨勭瓥鐣ュ疄鐜扮被銆傞偅涔堟垜浠氨鍙互浣跨敤闆嗗悎鏉ュ瓨鏀惧疄鐜扮被浜嗐€傛垚鍛樿祫鏍肩被鍨嬬敤浣滃皢鎵€鏈夋垚鍛樿祫鏍肩瓥鐣ユ敞鍐屽埌鍦板浘鐨勯敭銆備腑闂淬€傞渶瑕佹敞鎰忕殑鏄紝鏃ュ父寮€鍙戦兘鏄熀浜嶴pring鏉ヨ繘琛宐ean绠$悊鐨勩€傚綋鐒讹紝棣栧厛闇€瑕佸垱寤虹殑绛栫暐绫婚兘甯屾湜鐢盨pring鍔ㄦ€佹墭绠★紝鑰屼笉鏄垜浠嚜宸变竴涓竴涓殑鏂板缓瀹炰緥銆傞棶棰樻潵浜嗭紝濡備綍閫氳繃spring瀹炵幇绛栫暐绫荤殑鎵樼娉ㄥ唽鍛紵Spring鎻愪緵鐨処nitializingBean鎺ュ彛鎻愪緵浜嗗Bean杩涜灞炴€у垵濮嬪寲鍚庣殑澶勭悊鏂规硶銆傚畠鍙寘鎷琣fterPropertiesSet鏂规硶銆備换浣曠户鎵夸簡杩欎釜鎺ュ彛鐨勭被锛屽湪bean鐨勫睘鎬у垵濮嬪寲涔嬪悗閮戒細鎵ц杩欎釜鏂规硶銆傛垜浠€氳繃杩欎釜鏂规硶灏哠pring閫氳繃IOC鍒涘缓鐨凚ean娉ㄥ唽鍒癕ap涓€傛敼閫犵瓥鐣ュ伐鍘俰mportorg.example.model.VIP;importorg.example.strategy.VIPStrategy;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;/***@author:娆㈣繋鍠備俊鐚狽umber:鍥ц偉鑲ヤ簨*@date:2021/12/16*@email:jiongmefeishi@163.com*

*VIPStrategyFactory*/publicclassVIPStrategyFactory{//瀛樺偍绛栫暐绫诲疄渚媝ublicstaticMapstrategyMap=newConcurrentHashMap<>();privateVIPStrategyFactory(){}publicstaticVIPStrategygetVipStrategy(VIPvip){if(vip==null){returnnull;}returnstrategyMap.get(vip.getVipType().getCode());}}瀵圭瓥鐣ョ被杩涜鏀归€狅紝bean灞炴€у垵濮嬪寲鍚庯紝灏嗗疄渚嬪璞℃敞鍐屽埌宸ュ巶绫讳腑鐨刴ap涓€備互閲戠墝浼氬憳涓轰緥锛歩mportorg.example.factory.VIPStrategyFactory锛涘鍏rg.example.model.VIPEnums锛沬mportorg.example.strategy.VIPStrategy;importorg.springframework.beans.factory.InitializingBean;importorg.springframework.stereotype.Service;/***@浣滆€咃細娆㈣繋鍠傞噹鐚彿锛氬洤濂借偉鐨勪笢瑗?@鏃ユ湡锛?021/12/16*@email:jiongmefeishi@163.com**绛栫暐鎺ュ彛鍏蜂綋瀹炵幇绫?榛勯噾浼氬憳*/@ServicepublicclassGoldVIPStrategyImplimplementsVIPStrategy,InitializingBean{@Overridepublicvoidequity(){//TODO榛勯噾浼氬憳鎷ユ湁鐨勫叿浣撴潈鐩奡ystem.out.println("鍏蜂綋鏉冪泭浠ュ強閲戝崱浼氬憳鎵€鎷ユ湁鐨勬潈鐩娾€濓級锛泒@OverridepublicvoidafterPropertiesSet()throwsException{VIPStrategyFactory.strategyMap.put(VIPEnums.GOLD.getCode(),newGoldVIPStrategyImpl());}}閫氳繃绛栫暐妯″紡銆佸伐鍘傛ā寮忓拰Spring鐨処nitializingBean鎺ュ彛锛屽彲浠ョ湅浣滄槸瑙e喅浜嗗緢澶歩felse锛屼互鍚庡嚭鐜版柊鐨剉ip鏃舵洿瀹规槗鎵╁睍銆傚綋鐒讹紝杩欏彧鏄璁℃ā寮忔€濇兂鐨勪竴涓畝鍗曚緥瀛愩€傚湪瀹為檯鐨勫簲鐢ㄥ紑鍙戜腑锛岃繕鏄鏍规嵁鍏蜂綋鐨勪笟鍔″満鏅伒娲昏繍鐢ㄣ€傚彲浠ヨ嚜宸辨墜鍔ㄦā鎷熶竴浜涘満鏅紝姣斿濂惰尪搴楃殑鍚勭濂惰尪鏂板搧绛夌瓑銆傚鏋滄兂浣跨敤鍥х殑渚嬪瓙锛屽彲浠ュ湪boar璐﹀彿鍥炲220110瀵煎叆渚嬪瓙鑷繁杩愯銆傛敞鎰忥細瀛︿範杞欢璁捐鍘熺悊鍒囦笉鍙舰鎴愬己杩棁銆傞亣鍒板鏉傜殑涓氬姟鍦烘櫙锛岄渶瑕侀殢鏈哄簲鍙樸€傚涔犺璁″師鍒欐槸瀛︿範璁捐妯″紡鐨勫熀纭€銆傚湪瀹為檯寮€鍙戣繃绋嬩腑锛屼笉涓€瀹氳姹傛墍鏈変唬鐮侀兘閬靛惊璁捐鍘熷垯锛岃€屾槸瑕佺患鍚堣€冭檻浜哄姏銆佹椂闂淬€佹垚鏈€佽川閲忕瓑鍥犵礌锛屼笉鍒绘剰杩芥眰瀹岀編锛岃€屾槸鍦ㄥ悎閫傜殑鍦烘櫙涓嬮伒寰璁″師鍒欍€傝繖鍙嶆槧浜嗕竴绉嶆潈琛★紝鍙互甯姪鎴戜滑璁捐鏇翠紭闆呯殑浠g爜缁撴瀯銆傝璁℃ā寮忓疄闄呬笂鏄竴闂ㄨ壓鏈€傝璁℃ā寮忔潵婧愪簬鐢熸椿锛屼笉瑕佷负浜嗗簲鐢ㄨ璁℃ā寮忚€屼娇鐢ㄨ璁℃ā寮忋€傚枩娆㈢殑鏈嬪弸娆㈣繋鐐硅禐鏀惰棌鍏虫敞