Java8-行為參數化

在軟件工程中,一個眾所周知的問題就是,不管你做什么,用戶的需求肯定會變
行為參數化就是可以幫助你處理頻繁變更需求的一種軟件開發(fā)模式。

歡迎訪問本人博客:http://wangnan.tech

它意味著拿出一個代碼塊,把它準備好卻不執(zhí)行它,這個代碼塊以后可以被你的程序其他部分調用

我們看一個例子,我們通過不斷改進這個例子,展示行為參數化

版本1.1 篩選綠蘋果

如果要篩選紅蘋果怎么辦呢?

版本1.2 把顏色作為參數

如果要篩選重量大于150克的蘋果怎么辦?
你可能會有下面的代碼:

這有點令人失望,這打破了DRY(don't repeat yourself 不要重復自己)的軟件工程原則

版本1.3 對你能想到的每個屬性做篩選

這樣糟透了,代碼可讀性降低,而且如果要同時篩選多個屬性怎么辦?

讓我們后退一步來看看更高層次的抽象,一種可能的解決方案是對你的選擇標準建模:
需要根據apple的某個屬性來返回一個boolean,我們把它稱為謂詞

讓我們來定義一個接口來對選擇標準建模

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

現在你可以用ApplePredicate的多個實現代表不同的選擇標準了

這里使用到了策略模式

接下來,你需要filterApple方法接受ApplePredicate對象,對Apple做條件測試,這就是行為參數化,讓方法接受多種行為作為參數,并在內部使用,來完成不同的行為

版本1.4 根據抽象條件篩選

filterAppkes方法的行為取決于你通過ApplePredicate對象傳遞的代碼

目前為止,當要把新的行為傳遞給filterApples方法的時候,你不得不聲明好幾個實現ApplePredicate接口的類,然后實例化好幾個只會提到一次的ApplePredicate對象,下面是的程序總結了目前看到的一切

很啰嗦,浪費時間!

java有一個機制稱為匿名類,可以讓你同時聲明和實例化一個類,換句話說就是隨用隨建,它可以幫助你改進代碼

版本1.5 使用匿名類

匿名類也有缺點,往往很笨重,占用很多空間,用起來讓人費解,還是不能令人滿意。

版本1.6 使用lambda表達式

看起來干凈很多!

小結一下:

版本1.7 將list抽獎化

讓邏輯不僅適用于apple

再舉幾個真實的例子

用comprator來排序

對蘋果的按照重量排序

inventory.sort(Apple a1,Apple a2)-> a1.getWeight().compareTo(a2.getWeight());

用Runable執(zhí)行代碼塊

Thread t = new Thread(()->System.out.println("Hello world"));

GUI事件處理

鼠標點擊發(fā)送后顯示一個窗口

button.setAction((ActionEvent event)->label.setText("sent!"));

小結

  • 行為參數化,就是一個方法接受多個不同的行為作為參數,并在內部使用它們,完成不同行為的能力
  • 行為參數化可以讓代碼更好的適應不斷變化的要求,減輕未來工作量

(注:內容整理自《Java8實戰(zhàn)》)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容