嘻哈說:設計模式之介面隔離原則

番茄課堂_懶人發表於2019-02-24

1、定義

按照慣例,首先我們來看一下介面隔離原則的定義。

類間的依賴關係應該建立在最小的介面上。

介面中的方法應該儘量少,不要使介面過於臃腫,不要有很多不相關的邏輯方法。

有點類似於單一職責原則,都是功能儘可能的簡單單一,不要冗餘太多其他不相關的。

單一職責原則主要是類與方法,而介面隔離原則卻是對介面而言的。

2、場景

小廚洗菜,大廚做飯。

在番茄餐廳的後廚,老闆與求生欲極強的廚師長在聊天。

老闆:最近我們番茄餐廳廣受好評,菜品味道美味,這還得感謝你這位廚師長呀。

廚師長:應該的,這該感謝我。

老闆:嗯?你確定?

廚師長:還沒,還沒說完,這該感謝我…們的郝老闆,這次確定了。(冷汗)

老闆:你這求生欲厲害了,歎為觀止呀。不過現在隨著顧客的增多,人手再次不夠了,再招廚師肯定來不及了,你有什麼好辦法嗎?

廚師長:辦法我還真有一個,我們可以招點小廚,小廚要好招一些。

老闆:但小廚做飯不夠美味,很容易流失客戶的。

廚師長:小廚不做飯,小廚只負責洗菜。這樣呢,大廚就不用洗菜了,只負責做飯,這樣效率就上去了。

老闆:你是不是不想洗菜?

廚師長:當然不是,我就是,就是,就是替公司著想。

老闆:好吧,準了,招人吧。

3、程式碼

之前我們在依賴倒置原則聊過對介面程式設計,所以,首先我們定義一個廚師介面。

package com.fanqiekt.principle.segregation;

/**
 * 廚師介面
 *
 * @author 番茄課堂-懶人
 */
public interface IChef {

    /**
     * 洗菜
     */
    void wash();

    /**
     * 做飯
     */
    void cooking();
}
複製程式碼

廚師做兩件事,一個是洗菜,一個是做菜。

接下來,我們寫一下大廚的程式碼,大廚實現了廚師介面。

大廚做飯,但不負責洗菜。

package com.fanqiekt.principle.segregation;

/**
 * 大廚
 *
 * @author 番茄課堂-懶人
 */
public class BigChef implements IChef {

    /**
     * 洗菜的邏輯與大廚無關
     */
    @Override
    public void wash() {

    }

    @Override
    public void cooking() {
        System.out.println("大廚做飯");
    }
}
複製程式碼

我們再寫一下小廚的部分,小廚也是實現廚師介面。

小廚不做飯,小廚只洗菜。

package com.fanqiekt.principle.segregation;

/**
 * 小廚
 *
 * @author 番茄課堂-懶人
 */
public class Kitchen implements IChef {
    @Override
    public void wash() {
        System.out.println("小廚洗菜");
    }

    /**
     * 做飯的邏輯與小廚無關
     */
    @Override
    public void cooking() {

    }
}
複製程式碼

這樣的寫法,好不好?

當然不好,每個類都冗餘了與他不相關的方法。例如,BigChef中的wash方法、Kitchen中的cooking方法。

這種現象是怎麼導致的呢?

介面不夠最小化。介面隔離原則就是為了解決這種問題的。

我們可以寫成兩個介面,一個是做飯的介面,一個是洗菜的介面。

package com.fanqiekt.principle.segregation;

/**
 * 做飯介面
 *
 * @author 番茄課堂-懶人
 */
public interface ICook {

    /**
     * 做飯
     */
    void cooking();
}

複製程式碼

做飯的介面。

package com.fanqiekt.principle.segregation;

/**
 * 洗菜介面
 *
 * @author 番茄課堂-懶人
 */
public interface IWash {

    /**
     * 洗菜
     */
    void wash();

}
複製程式碼

洗菜的介面。

我們再來看一下符合介面隔離原則的具體實現類。

package com.fanqiekt.principle.segregation;

/**
 * 大廚
 *
 * @author 番茄課堂-懶人
 */
public class BigChef implements ICook{

    /**
     * 大廚只負責做飯,只處理和做飯相關的邏輯
     */
    @Override
    public void cooking() {
        System.out.println("大廚做飯");
    }
}
複製程式碼

這樣就沒有冗餘程式碼了。

package com.fanqiekt.principle.segregation;

/**
 * 小廚
 *
 * @author 番茄課堂-懶人
 */
public class Kitchen implements IWash {

    /**
     * 小廚只負責洗菜,只處理和洗菜相關的邏輯
     */
    @Override
    public void wash() {
        System.out.println("小廚洗菜");
    }
}
複製程式碼

小廚同樣也沒有冗餘程式碼了。

這樣的寫法是不是更加的優雅了。

如果新增一種既洗菜又做飯的廚師型別,那同時實現ICook與IWash介面就可以了。

3、優點

它與單一職責原則類似,優點也是類似的。

降低風險
修改其中的一個業務,不會影響到業務。

易維護易擴充套件
沒有冗餘程式碼,符合介面隔離原則的介面,會更加容易擴充套件以及維護。

4、嘻哈說

接下來,請您欣賞介面隔離原則的原創歌曲

嘻哈說:介面隔離原則
作曲:懶人
作詞:懶人
Rapper:懶人

奮鬥了多年總算熬成了大廚才不要關心洗菜
這些瑣事都摘不掉
剛入行一兩年但兢兢業業的小廚還不到烹飪大菜
因為這些來不了
所以介面功能太多在胡鬧
介面功能應該儘可能最少
這就是介面隔離
核心思想就是介面最小
這樣才結構得體
風險降低易擴充套件維護也有格局
用起來它是絕對合理
複製程式碼

試聽請點選這裡

閒來無事聽聽曲,知識已填腦中去;

學習複習新方式,頭戴耳機不小覷。

番茄課堂,學習也要酷。

相關文章