日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(二)行为化参数传递代码

發(fā)布時(shí)間:2025/5/22 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (二)行为化参数传递代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

行為參數(shù)化就是可以幫助你處理頻繁變更需求的一種軟件開發(fā)模式。
篩選蘋果的例子:
Apple 類

@Getter @Setter public class Apple {private Integer weight;private String color;}

1.篩選出綠蘋果

public static List<Apple> filterGreenApples(List<Apple> inventory) {List<Apple> result = new ArrayList<Apple>();for(Apple apple: inventory){if( "green".equals(apple.getColor() ) {result.add(apple);}}return result;}

當(dāng)滿足了篩選綠蘋果的需求后,用戶可能會(huì)改變需求,需要篩選紅蘋果,淺綠色蘋果等,所以我們需要在編寫類似的代碼之后嘗試對(duì)其進(jìn)行抽象,把顏色變成一個(gè)參數(shù)

public static List<Apple> filterApplesByColor(List<Apple> inventory,String color) {List<Apple> result = new ArrayList<Apple>();for (Apple apple: inventory){if ( apple.getColor().equals(color) ) {result.add(apple);}}return result;}

這樣就能滿足篩選不同顏色蘋果的需求了。滿足這個(gè)需求之后,農(nóng)民可能會(huì)想,要是能篩選出重蘋果或者輕蘋果就好了,大于150g的為重蘋果,于是就有

public static List<Apple> filterApplesByWeight(List<Apple> inventory,int weight) {List<Apple> result = new ArrayList<Apple>();For (Apple apple: inventory){if ( apple.getWeight() > weight ){result.add(apple);}}return result;}

這樣做雖然滿足了需求,但是卻復(fù)制了大部分代碼,他們僅有下面兩句代碼不同

if ( apple.getColor().equals(color) ) {result.add(apple);}if ( apple.getWeight() > weight ){result.add(apple);}

行為參數(shù)化

到這里,你可能會(huì)想到農(nóng)民可能會(huì)根據(jù)蘋果的產(chǎn)地,蘋果的采摘時(shí)間等等各種不同屬性來進(jìn)行篩選,于是索性抽象出一個(gè)filterApples的方法。而篩選的條件無非就是根據(jù)蘋果的各種屬性進(jìn)行判斷,然后返回一個(gè)boolean值,于是我們抽象出ApplePredicate接口

public interface ApplePredicate{boolean test (Apple apple);}

現(xiàn)在你就可以用ApplePredicate的多個(gè)實(shí)現(xiàn)代表不同的選擇標(biāo)準(zhǔn)了

public class AppleHeavyWeightPredicate implements ApplePredicate{public boolean test(Apple apple){return apple.getWeight() > 150;}}public class AppleGreenColorPredicate implements ApplePredicate{public boolean test(Apple apple){return "green".equals(apple.getColor());}}

在這里我們抽象了ApplePredicate,每一種篩選就是一個(gè)策略,我們定義了篩選蘋果的一族算法,把他們封裝起來然后,然后在運(yùn)行時(shí)選擇一種算法,這就和策略模式相關(guān)聯(lián)了。
經(jīng)過抽象之后我們的filterApples方法是這樣的

public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){List<Apple> result = new ArrayList<>();for(Apple apple: inventory){if(p.test(apple)){ #篩選判斷result.add(apple);}}return result;}

到這里,當(dāng)農(nóng)民又提出新的需求,比如想要篩選出大于150g的紅蘋果,那么只需要實(shí)現(xiàn)ApplePredicate接口,然后傳入filterApples就能滿足需求了,這比之前的方式要靈活很多。這時(shí)filterApples方法的行為取決于你通過ApplePredicate對(duì)像傳遞的代碼,也就是我們filterApples方法的行為參數(shù)化了。
從上面的例子看比如篩選綠顏色蘋果的類

public class AppleGreenColorPredicate implements ApplePredicate{public boolean test(Apple apple){return "green".equals(apple.getColor());}}

其實(shí)我們只關(guān)心的是返回boolean值部分的代碼

"green".equals(apple.getColor());

而其他的代碼都是實(shí)現(xiàn)一個(gè)接口的模板代碼,都不是我們關(guān)心的,而通過lambda表達(dá)式我們就可以去掉那些臃腫的模板代碼,像下面這樣

filterApples(inventory,apple -> "green".equals(apple.getColor()));

抽象升級(jí)

現(xiàn)在我們已經(jīng)能夠應(yīng)對(duì)農(nóng)民篩選蘋果的需求了,但是當(dāng)農(nóng)民提出要對(duì)自家梨,橘子也有各種不同的篩選需求,此時(shí)我們不會(huì)有跟著將上面類似的代碼寫三遍,而是進(jìn)行進(jìn)一步的抽象,抽象成對(duì)一個(gè)列表根據(jù)不同條件進(jìn)行篩選的方法,各種篩選條件就是不同的行為參數(shù),于是就有了jdk里面stream的filter方法

Stream<T> filter(Predicate<? super T> predicate);

后面章節(jié)再介紹流
像上面的例子就可以寫成

apples.stream().filter(apple -> "green".equals(apple.getColor()));

這段代碼的意思是通過通過apples獲得一個(gè)流,然后利用filter方法對(duì)蘋果進(jìn)行篩選。
類似于這樣行為參數(shù)化的例子還有很多,他們結(jié)合lambda表達(dá)式會(huì)使得代碼的編寫變得更加簡(jiǎn)潔和優(yōu)雅。通過抽象升級(jí)也使得代碼更加靈活,易于擴(kuò)展和維護(hù),更加擁抱新的變化。

注:內(nèi)容參考至《java8實(shí)戰(zhàn)》掃描下方二維碼關(guān)注微信公眾號(hào),輸入java8sz下載該書。

轉(zhuǎn)載于:https://www.cnblogs.com/vincili/p/9260681.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的(二)行为化参数传递代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。