java8學習:經過行爲參數化傳遞代碼

  • 以下一段代碼請看java

    @Test
    public void test() throws Exception {
        List<Apple> list = new ArrayList<>();
        for (Apple apple : list) {
            if (apple.getWeight() > 1000){
                System.out.println("...");
            }
        }
    }
    • 這段代碼再簡單不過了,而且完成了該完成的判斷條件,可是若是如今並非想判斷重量weight了,而是須要判斷color是否是紅色的了,那麼就只能代碼複製而後改條件了,以下
    @Test
    public void test() throws Exception {
        List<Apple> list = new ArrayList<>();
        for (Apple apple : list) {
            if ("red".equals(apple.getColor())){
                System.out.println("...");
            }
        }
    }
    • 此時發現,除了更改了if條件,其餘地方是沒有動的,可是若是我又須要更改別的條件呢,無奈只好再次變換if條件,針對這一的狀況,java8的行爲參數化就能夠處理頻繁的變動
  • 行爲參數化編程

    • 如上的篩選蘋果顏色的代碼,這時候我忽然想要綠色的或者彩虹色可咋辦難道還要拷貝?
    public void getAppleByColor(List<Apple> apples,String color){
                for (Apple apple : apples) {
                    if (color.equals(apple.getColor())){
                        System.out.println("...");
                    }
                }
            }
    //getAppleByColor(lists,"red");     //調用
    • 上面這段代碼就解決了一直變動的顏色的問題,任他來的是透明顏色都沒問題,而且調用方法時,也能夠清晰的看出來咱們須要的是什麼蘋果
    • 蘋果大賣錢就多,那麼若是按照重量篩選呢?代碼已經給出來了,那麼就是開篇的第二段代碼,仔細想一下雖然解決了咱們的問題,可是是否是代碼重複的太多了,而且這樣的編程風格十分很差,違反了DRY(don't repeat yourself),這時候咱們就可能想到了進一步的解決辦法來應對重量和顏色的不一樣選擇,那就是立flag,以下
public void getAppleByColor(List<Apple> apples,String color,Integer weight,boolean isColor){
    for (Apple apple : apples) {
        if ((isColor && color.equals(apple.getColor())) ||
            !isColor && weight > apple.getWeight()){
            System.out.println("...");
        }
    }
}
getAppleByColor(lists,"red",0,true);       //調用
getAppleByColor(lists,"",123,false);       //調用
  • 如上,調用簡直不能再糟了,若是不讓調用者看到方法的方法簽名和解釋,那麼他確定不會知道true表明啥false表明啥,因此這種方法解決此問題是十分不可取的,那麼咱們確定就須要更好的解決方案
  • 思路:創建一個接口,那麼就有類去實現接口,那麼每一個實現類不就表明一種行爲嗎?好比這樣改
相關文章
相關標籤/搜索