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

设计模式学习24(Java实现)-策略模式

时间:2023-04-01 20:23:55 Java

鍐欏湪鍓嶉潰锛岃褰曞涔犺璁℃ā寮忕殑绗旇锛屾彁楂樿璁℃ā寮忕殑鐏垫椿杩愮敤瀛︿範鍦板潃https://www.bilibili.com/video...https://www.bilibili.com/video...鍙傝€冩枃绔爃ttp://c.biancheng.net/view/1...椤圭洰婧愮爜https://gitee.com/zhuang-kang/DesignPattern26銆佺瓥鐣ユā寮?6.1绛栫暐妯″紡绛栫暐锛圫trategy锛夋ā寮忕殑瀹氫箟鍜岀壒鐐规ā寮忓畾涔夛細杩欑妯″紡瀹氫箟浜嗕竴绯诲垪鐨勭畻娉曪紝骞跺姣忎釜绠楁硶杩涜浜嗗皝瑁咃紝浣垮緱瀹冧滑鍙互鐩镐簰鏇挎崲锛岀畻娉曠殑鏀瑰彉涓嶄細褰卞搷鍒板鎴疯皝浣跨敤绠楁硶銆傜瓥鐣ユā寮忓睘浜庡璞¤涓烘ā寮忋€傚畠瀵圭畻娉曡繘琛屽皝瑁咃紝灏嗕娇鐢ㄧ畻娉曠殑璐d换涓庣畻娉曠殑瀹炵幇鍒嗙锛屽鎵樼粰涓嶅悓鐨勫璞℃潵绠$悊杩欎簺绠楁硶銆係trategy妯″紡鐨勪富瑕佷紭鐐瑰涓嬨€傚涓潯浠惰鍙ヤ笉鏄撶淮鎶わ紝浣跨敤绛栫暐妯″紡鍙互閬垮厤浣跨敤澶氫釜鏉′欢璇彞锛屽if...else璇彞锛宻witch...case璇彞銆傜瓥鐣ユā寮忔彁渚涗簡涓€绯诲垪鍙噸鐢ㄧ殑绠楁硶鏃忋€傞€傚綋鍦颁娇鐢ㄧ户鎵垮彲浠ュ皢绠楁硶鏃忕殑鍏叡浠g爜杞Щ鍒扮埗绫讳腑锛屼粠鑰岄伩鍏嶉噸澶嶄唬鐮併€傜瓥鐣ユā寮忓彲浠ヤ负鍚屼竴琛屼负鎻愪緵涓嶅悓鐨勫疄鐜帮紝瀹㈡埛鍙互鏍规嵁涓嶅悓鐨勬椂闂存垨绌洪棿闇€姹傞€夋嫨涓嶅悓鐨勫疄鐜般€傜瓥鐣ユā寮忓寮€闂師鍒欐彁渚涗簡瀹岀編鐨勬敮鎸侊紝鍙互鍦ㄤ笉淇敼鍘熸湁浠g爜鐨勬儏鍐典笅鐏垫椿鐨勬坊鍔犳柊鐨勭畻娉曘€傜瓥鐣ユā寮忔妸绠楁硶鐨勪娇鐢ㄦ斁鍒扮幆澧冪被涓紝鎶婄畻娉曠殑瀹炵幇绉诲埌鍏蜂綋鐨勭瓥鐣ョ被涓紝瀹炵幇浜嗕袱鑰呯殑鍒嗙銆傚畠鐨勪富瑕佺己鐐瑰涓嬨€傚鎴风蹇呴』浜嗚В鎵€鏈夌瓥鐣ョ畻娉曚箣闂寸殑宸紓锛屼互渚垮湪姝g‘鐨勬椂闂撮€夋嫨鍚堥€傜殑绠楁硶绫诲埆銆傜瓥鐣ユā寮忓垱寤轰簡寰堝绛栫暐绫伙紝澧炲姞浜嗙淮鎶ょ殑闅惧害銆?6.2绛栫暐妯″紡鐨勭粨鏋勫拰瀹炵幇26.2.1绛栫暐妯″紡鐨勭粨鏋勬娊璞$瓥鐣ワ紙Strategy锛夌被锛氬畾涔変簡涓€涓€氱敤鐨勬帴鍙o紝鍚勭绠楁硶浠ヤ笉鍚岀殑鏂瑰紡瀹炵幇杩欎釜鎺ュ彛锛岀幆澧冭鑹蹭娇鐢ㄨ繖涓帴鍙f潵璋冪敤涓嶅悓鐨勭畻娉曪紝閫氬父浣跨敤鎺ュ彛鎴栨娊璞$被銆侰oncreteStrategy绫伙細瀹炵幇鎶借薄绛栫暐瀹氫箟鐨勬帴鍙o紝鎻愪緵鍏蜂綋鐨勭畻娉曞疄鐜般€傜幆澧冿紙Context锛夌被锛氭寔鏈変竴涓瓥鐣ョ被鐨勫紩鐢紝鏈€缁堣瀹㈡埛绔皟鐢ㄣ€?6.2.2浠g爜瀹炵幇涓嶅悓鑺傛棩涓嶅悓淇冮攢娲诲姩鍏崇郴绫诲浘Strategypackagecom.zhuang.strategy;/***@ClassnameStrategy*@Description瀹氫箟鍏叡鎺ュ彛*@Date2021/3/3115:29*@Createdbydell*/publicinterfaceStrategy{voidshow();}StrategyApackagecom.zhuang.strategy;/***@ClassnameStrategyA*@Description瀹氫箟姣忎釜鑺傛棩鐨勫叿浣撶瓥鐣ヨ鑹插拰鍏蜂綋淇冮攢*@Date2021/3/3115:29*@Createdbydell*/publicclassStrategyAimplementsStrategy{@Overridepublicvoidshow(){System.out.println("淇冮攢涔颁竴閫佷竴");}}StrategyBpackagecom.zhuang.strategy;/***@ClassnameStrategyB*@Description瀹氫箟姣忎釜鑺傛棩鐨勫叿浣撶瓥鐣ヨ鑹插拰鍏蜂綋淇冮攢*@Date2021/3/3115:30*@Createdbydell*/publicclassStrategyBimplementsStrategy{@Overridepublicvoidshow(){System.out.println("B鎺ㄥ箍婊?00鍑?0");}}StrategyCpackagecom.zhuang.strategy;/***@ClassnameStrategyC*@Description瀹氫箟姣忎釜鑺傛棩鍏蜂綋绛栫暐瑙掕壊鐨勫叿浣撲績閿€娲诲姩*@Date2021/3/3115:30*@Createdbydell*/public绫籗trategyC瀹炵幇绛栫暐{@Overridepublicvoidshow(){System.out.println("C淇冮攢婊?00鍏冨彲鍏戞崲灏忕ぜ鐗?);}}SalesManpackagecom.zhuang.strategy;/***@ClassnameSalesMan*@Description瀹氫箟杩炴帴涓婁笅鏂囩殑鐜瑙掕壊鍚戝鎴烽攢鍞績閿€娲诲姩*@Date2021/3/3115:32*@Createdbydell*/publicclassSalesMan{//鎸佹湁鎶借薄绛栫暐瑙掕壊鐨勫紩鐢╬rivateStrategystrategy;publicSalesMan(绛栫暐绛栫暐){杩欎釜銆傛垬鐣?鎴樼暐锛泒publicStrategygetStrategy(){杩斿洖绛栫暐锛泒publicvoidsetStrategy(绛栫暐绛栫暐){this.strategy=strategy;}//灞曠ず淇冮攢publicvoidsalesManShow(){strategy.show();}}Clientpackagecom.zhuang.strategy;/***@ClassnameClient*@DescriptionStrategy妯″紡娴嬭瘯绫?@Date2021/3/3115:34*@Createdbydell*/publicclassClient{publicstaticvoidmain(String[]args){SalesMansalesMan=newSalesMan(newStrategyA());//鍏竴鍎跨鑺俿alesMan.salesManShow();System.out.println("========================");//鍔冲姩鑺傞攢鍞甅an.setStrategy(newStrategyB());salesMan.salesManShow();System.out.println("=======================");//绔崍鑺俿alesMan.setStrategy(newStrategyC());salesMan.salesManShow();}}26.3Strategy妯″紡搴旂敤鍦烘櫙褰撶郴缁熼渶瑕佸姩鎬侀€夋嫨鍑犵绠楁硶涓殑涓€绉嶆椂锛屽彲浠ュ皢姣忕绠楁硶灏佽鍒颁竴涓猻trategy绫讳腑锛屽湪涓€涓畾涔変簡澶氫釜琛屼负鐨勭被涓紝杩欎簺琛屼负鍦ㄨ繍琛屼腑浠ュ涓潯浠惰鍙ョ殑褰㈠紡鍑虹幇鍦ㄨ繖涓被涓紝姣忎釜鏉′欢鍒嗘敮閮藉彲浠ョЩ鍔ㄥ埌瀹冧滑鍚勮嚜鐨勭瓥鐣ョ被涓潵鏇挎崲杩欎簺鏉′欢璇彞銆傜郴缁熶腑鍚勪釜绠楁硶瀹屽叏鐙珛锛岃姹傚瀹㈡埛绔殣钘忓叿浣撶畻娉曠殑瀹炵幇缁嗚妭銆傚綋绯荤粺瑕佹眰浣跨敤璇ョ畻娉曠殑瀹㈡埛绔笉搴旇鐭ラ亾瀹冩墍鎿嶄綔鐨勬暟鎹椂锛屽彲浠ヤ娇鐢ㄧ瓥鐣ユā寮忔潵闅愯棌涓庤绠楁硶鐩稿叧鐨勬暟鎹粨鏋勩€傚涓被涔嬮棿鐨勫敮涓€鍖哄埆鏄畠浠殑琛屼负涓嶅悓銆傛偍鍙互浣跨敤绛栫暐妯″紡鍦ㄨ繍琛屾椂鍔ㄦ€侀€夋嫨瑕佹墽琛岀殑鐗瑰畾琛屼负銆?6.4Comparator涓璊DK婧愮爜鍒嗘瀽绛栫暐妯″紡銆侫rrays绫讳腑鏈変竴涓猻ort()鏂规硶锛屽涓嬶細publicclassArrays{publicstaticvoidsort(T[]a,Comparatorc){if(c==null){sort锛圓锛?}else{if(LegacyMergeSort.userRequested)legacyMergeSort(a,c);鍚﹀垯TimSort.sort(a,0,a.length,c,null,0,0);}}}Arrays鏄竴涓幆澧冭鑹茬被锛岃繖涓猻ort鏂规硶鍙互浼犻€掍竴涓柊鐨勭瓥鐣ヨArrays鎸夌収杩欎釜绛栫暐杩涜鎺掑簭銆傛瘮濡備笅闈㈢殑娴嬭瘯绫汇€傚叕鍏辩被婕旂ず{publicstaticvoidmain(String[]args){Integer[]data={12,2,3,2,4,5,1};//瀹炵幇闄嶅簭鎺掑簭Arrays.sort(data,newComparator(){publicintcompare(Integero1,Integero2){returno2-o1;}});System.out.println(Arrays.toString(鏁版嵁));//[12,5,4,3,2,2,1]}}杩欓噷鎴戜滑璋冪敤Arrays鐨剆ort鏂规硶鏃讹紝绗簩涓弬鏁版槸Comparator鎺ュ彛鐨勫瓙瀹炵幇绫诲璞°€傛墍浠omparator鍏呭綋鎶借薄鐨勭瓥鐣ヨ鑹诧紝鑰屽叿浣撶殑瀛愬疄鐜扮被鍏呭綋鍏蜂綋鐨勭瓥鐣ヨ鑹层€傜幆澧冭鑹茬被锛堟暟缁勶級搴旇淇濆瓨瀵硅璋冪敤鐨勬娊璞$瓥鐣ョ殑寮曠敤銆傞偅涔堬紝Arrays绫荤殑sort鏂规硶鏄惁浣跨敤浜咰omparator瀛愬疄鐜扮被涓殑compare()鏂规硶鍛紵鎴戜滑缁х画鐪婽imSort绫荤殑sort()鏂规硶锛屼唬鐮佸涓嬶細classTimSort{staticvoidsort(T[]a,intlo,inthi,Comparatorc,T[]work,intworkBase,intworkLen){assertc!=null&&a!=null&&lo>=0&&lo<=hi&&hi<=a.length;intnRemaining=hi-lo;濡傛灉(nRemaining<2)杩斿洖锛?/澶у皬涓?鍜?鐨勬暟缁勫缁堟帓搴?/濡傛灉鏁扮粍寰堝皬锛屽垯鎵ц涓嶅悎骞剁殑鈥滆糠浣燭imSort鈥漣f(nRemainingintcountRunAndMakeAscending(T[]a,intlo,inthi,Comparatorc){assertlo=0)runHi++;}杩斿洖runHi-lo;}}涓婇潰鐨勪唬鐮佹渶缁堜細杩愯鍒癱ountRunAndMakeAscending()杩欎釜鏂规硶涓紝鎴戜滑鍙互鐪嬪埌鍙娇鐢ㄤ簡compare鏂规硶锛屾墍浠ュ湪璋冪敤Arrays.sort鏂规硶鏃跺彧浼犻€掍簡鍏蜂綋compareoverride鏂规硶鐨勭被瀵硅薄锛岃繖涔熸槸蹇呴』鐢盋omparator鎺ュ彛涓殑瀛愮被瀹炵幇鐨勬柟娉曘€傚啓鍦ㄦ渶鍚庡鏋滄垜鐨勬枃绔犲浣犳湁鐢紝璇风粰鎴戜竴涓煈嶏紝璋㈣阿馃槉锛佹湁浠€涔堥棶棰樻杩庡湪璇勮鍖烘寚鍑猴紒馃挭