文章目錄閱讀完《Java進(jìn)階高手》第一章以及第二章;對書中知識進(jìn)行復(fù)盤整理;主要記錄:通過行為參數(shù)化傳遞代碼
成都創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),賣友情鏈接,1元廣告為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計到用戶體驗提高,創(chuàng)新互聯(lián)力求做到盡善盡美。
正文內(nèi)容:
具體的代碼如下所示:
public class Apple {private Integer weight;
private Color color;
public Integer getWeight() { return weight;
}
public void setWeight(Integer weight) { this.weight = weight;
}
public Color getColor() { return color;
}
public void setColor(Color color) { this.color = color;
}
}
enum Color {RED, GREEN
}
public class Filter {public static ListfilterGreenApple(Listinventory) {Listresult = new ArrayList<>();
for (Apple apple : inventory) {if (GREEN.equals(apple.getColor())) {result.add(apple);
}
}
return result;
}
}
我們現(xiàn)在使用枚舉類把蘋果的顏色進(jìn)行描述,然后將蘋果抽象化為Apple類,包含顏色與重量的屬性,最后構(gòu)造過濾類,在過濾類里面給出具體的過濾綠色蘋果的方法filterGreenApple;如果現(xiàn)在需求變了,農(nóng)民需要過濾紅色蘋果,那么我們就需要將filterGreenApple方法復(fù)制一份,將方法名改為filterRedApple并且將里面的GREEN顏色改為RED;這個樣子確實解決了問題,但是很明顯,重復(fù)代碼很多,并不是一個好的解決方法;一個好的解決方法是我們編寫類似代碼后,盡量對其進(jìn)行抽象化
2.再展身手:把顏色作為參數(shù)在上一版代碼中,我們復(fù)制filterGreenApple方法完成對紅色蘋果的過濾,重復(fù)了filterGreenApple中大量代碼,怎樣避免這種問題的發(fā)生呢?好的解決方式是將顏色進(jìn)行參數(shù)化,把顏色作為參數(shù)傳遞給過濾的方法,這樣子就靈活適應(yīng)變化了
public static ListfilterApple(Listinventory,Color color) {Listresult = new ArrayList<>();
for (Apple apple : inventory) {if (color.equals(apple.getColor())) {result.add(apple);
}
}
return result;
}
現(xiàn)在解決了顏色篩選的問題,但是農(nóng)民又跑過來告訴你:要是可以區(qū)分蘋果的重量就太好了,重的蘋果一般是重量大于150克
對于我們來說,這不是問題,我們只需要重新寫一個過濾蘋果的方法就可以了,我們現(xiàn)在復(fù)制filterApple方法,然后把形參color改為weight,然后把篩選條件改為weight大于150就完成了
具體代碼如下所示:
public static ListfilterApple(Listinventory, Integer weight) {Listresult = new ArrayList<>();
for (Apple apple : inventory) {if (apple.getWeight() >weight) {result.add(apple);
}
}
return result;
}
-我們可以將重量和顏色都作為參數(shù)傳遞給方法,然后給一個標(biāo)記,根據(jù)標(biāo)記去判斷是通過顏色還是重量過濾蘋果
3.第三次嘗試:對你能想到的每個屬性做篩選我們將所有的蘋果屬性結(jié)合起來,如下所示:
public static ListfilterApple(Listinventory,
Color color, Integer weight, boolean flag) {Listresult = new ArrayList<>();
for (Apple apple : inventory) {if ((flag && color.equals(apple.getColor())) ||
(!flag && apple.getWeight() >weight)) {result.add(apple);
}
}
return result;
}
現(xiàn)在的問題確實已經(jīng)解決了,但是這個解決方案再差不過。首先客戶端看上去糟糕透了,true和false是什么意思?此外,這個解決方案無法應(yīng)對變化的需求,如果這位農(nóng)民要求你對蘋果的不同屬性進(jìn)行篩選,比如,大小,產(chǎn)地,形狀等,該怎樣處理?或者農(nóng)民要求組合屬性,做更復(fù)雜的查詢,比如綠色的重蘋果,又該怎么辦?如今的情況,我們需要一種更好的解決方式來告訴過濾方法
一種可能的解決方式是對我們的選擇標(biāo)準(zhǔn)進(jìn)行建模:考慮的是蘋果,需要根據(jù)Apple的某些屬性(比如它是綠色的嗎?重量超過150克嗎?)來返回一個boolean值。我們把它稱為謂詞(即一個返回boolean值的函數(shù))。讓我們定義一個接口來對選擇標(biāo)準(zhǔn)建模:
public interface ApplePredicate {boolean test(Apple apple);
}
選擇蘋果的不同策略,可以將這些標(biāo)準(zhǔn)看作filter方法的不同行為。剛才做的這些和策略設(shè)計模式相關(guān),它讓我們定義一族算法,把它們封裝起來(稱為策略),然后再運(yùn)行的時候選擇一個算法。在則這里,算法族就是ApplePredicate,不同的策略就是AppleGreenColorPredicate和AppleHeavyWeightPredicate
public class AppleGreenColorPredicate implements ApplePredicate{@Override
public boolean test(Apple apple) {return GREEN.equals(apple.getColor());
}
}
public class AppleHeavyWeightPredicate implements ApplePredicate {@Override
public boolean test(Apple apple) {return apple.getWeight() >150;
}
}
但是,該怎么利用ApplePredicate的不同實現(xiàn)呢?我們需要filterApple方法接受ApplePredicate對象,對Apple做條件測試。這就是行為參數(shù)化:讓方法接受多種行為(策略)作為參數(shù),并在內(nèi)部使用,來完成不同行為
具體代碼如下:
public class Filter {public static ListfilterApple(Listinventory,ApplePredicate predicate){ArrayListresult = new ArrayList<>();
for (Apple apple:inventory){if(predicate.test(apple)){result.add(apple);
}
}
return result;
}
}
在這個例子中,唯一重要的代碼是test方法的實現(xiàn),正是它定義了filterApple方法的新行為。但是現(xiàn)在有一個遺憾,由于filterApple方法只接受對象,所以我們必須把代碼包裹在ApplePredicate對象里。這種做法類似于內(nèi)聯(lián)“傳遞代碼”,因為我們通過實現(xiàn)一個test方法來傳遞布爾表達(dá)式值。再JDK8之后我們可以使用Lambda進(jìn)一步簡化代碼,這樣子我們就無須定義多個ApplePredicate實現(xiàn)類了,從而去掉不必要的代碼
具體代碼如下:
public class Main {public static void main(String[] args) {Listresult1 = Filter.filterApple(new ArrayList(), (apple) ->GREEN.equals(apple.getColor()));
Listresult2 = Filter.filterApple(new ArrayList(), (apple) ->apple.getWeight() >150);
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱:Java進(jìn)階高手讀書筆記1-行為參數(shù)化-創(chuàng)新互聯(lián)
當(dāng)前URL:http://muchs.cn/article40/ioheo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站改版、商城網(wǎng)站、服務(wù)器托管、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容