(二)行为化参数传递代码
行為參數(shù)化就是可以幫助你處理頻繁變更需求的一種軟件開發(fā)模式。
篩選蘋果的例子:
Apple 類
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;}當滿足了篩選綠蘋果的需求后,用戶可能會改變需求,需要篩選紅蘋果,淺綠色蘋果等,所以我們需要在編寫類似的代碼之后嘗試對其進行抽象,把顏色變成一個參數(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;}這樣就能滿足篩選不同顏色蘋果的需求了。滿足這個需求之后,農民可能會想,要是能篩選出重蘋果或者輕蘋果就好了,大于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;}這樣做雖然滿足了需求,但是卻復制了大部分代碼,他們僅有下面兩句代碼不同
if ( apple.getColor().equals(color) ) {result.add(apple);}if ( apple.getWeight() > weight ){result.add(apple);}行為參數(shù)化
到這里,你可能會想到農民可能會根據(jù)蘋果的產地,蘋果的采摘時間等等各種不同屬性來進行篩選,于是索性抽象出一個filterApples的方法。而篩選的條件無非就是根據(jù)蘋果的各種屬性進行判斷,然后返回一個boolean值,于是我們抽象出ApplePredicate接口
public interface ApplePredicate{boolean test (Apple apple);}現(xiàn)在你就可以用ApplePredicate的多個實現(xià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,每一種篩選就是一個策略,我們定義了篩選蘋果的一族算法,把他們封裝起來然后,然后在運行時選擇一種算法,這就和策略模式相關聯(lián)了。
經過抽象之后我們的filterApples方法是這樣的
到這里,當農民又提出新的需求,比如想要篩選出大于150g的紅蘋果,那么只需要實現(xiàn)ApplePredicate接口,然后傳入filterApples就能滿足需求了,這比之前的方式要靈活很多。這時filterApples方法的行為取決于你通過ApplePredicate對像傳遞的代碼,也就是我們filterApples方法的行為參數(shù)化了。
從上面的例子看比如篩選綠顏色蘋果的類
其實我們只關心的是返回boolean值部分的代碼
"green".equals(apple.getColor());而其他的代碼都是實現(xiàn)一個接口的模板代碼,都不是我們關心的,而通過lambda表達式我們就可以去掉那些臃腫的模板代碼,像下面這樣
filterApples(inventory,apple -> "green".equals(apple.getColor()));抽象升級
現(xiàn)在我們已經能夠應對農民篩選蘋果的需求了,但是當農民提出要對自家梨,橘子也有各種不同的篩選需求,此時我們不會有跟著將上面類似的代碼寫三遍,而是進行進一步的抽象,抽象成對一個列表根據(jù)不同條件進行篩選的方法,各種篩選條件就是不同的行為參數(shù),于是就有了jdk里面stream的filter方法
Stream<T> filter(Predicate<? super T> predicate);后面章節(jié)再介紹流
像上面的例子就可以寫成
這段代碼的意思是通過通過apples獲得一個流,然后利用filter方法對蘋果進行篩選。
類似于這樣行為參數(shù)化的例子還有很多,他們結合lambda表達式會使得代碼的編寫變得更加簡潔和優(yōu)雅。通過抽象升級也使得代碼更加靈活,易于擴展和維護,更加擁抱新的變化。
注:內容參考至《java8實戰(zhàn)》掃描下方二維碼關注微信公眾號,輸入java8sz下載該書。
轉載于:https://www.cnblogs.com/vincili/p/9260681.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的(二)行为化参数传递代码的全部內容,希望文章能夠幫你解決所遇到的問題。