嘻哈說:開放封閉原則

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

1、定義

之前我們已經說過:

《嘻哈說:單一職責原則》

《嘻哈說:里氏替換原則》

《嘻哈說:依賴倒置原則》

《嘻哈說:介面隔離原則》

《嘻哈說:迪米特法則》

集齊五個原則,就可以召喚神龍了。

神龍就是開放封閉原則,可以這樣說:它是其他五大原則的實現,是物件導向設計的終極目標

既然開放封閉原則這麼高階大氣上凳次,那我們趕緊來看一下開放封閉原則的定義。

一個軟體實體應當對擴充套件開放,但對修改關閉

對擴充套件開放的意思是,我們可以肆無忌憚的增加新功能。

對修改關閉的意思是,對原有功能不會產生任何修改。

可以說這是寫程式碼的最高境界。

遺憾的是,這種情況不可能發生。需求本身就是在修修改改,程式又是為需求服務的,程式碼不修改是不可能的。

我們要儘量做到的開放封閉原則。完全做到開放封閉原則,臣妾做不到哇!

嘻哈說:開放封閉原則

2、怎麼做

大家可以思考下:怎麼樣才能做到對擴充套件開放,對修改封閉呢?

方法1:抽象一個介面或者抽象類,定義公共的方法,從而方便擴充套件。

方法2:引用介面或者抽象類,不依賴具體實現類。

方法3:介面和抽象類不能修改,可以繼承介面或者抽象類從而達到擴充套件的目的。

這三個方法都在圍繞著一個核心,是什麼呢?

沒錯,就是抽象

我們應該面向抽象程式設計,不要面向具體程式設計。

有沒有似曾相識的感覺?

是的,依賴倒置原則中也曾經提到過這樣的思想。

開放封閉原則是總綱,而依賴倒置原則是開放封閉原則一個非常好的實現。

還有里氏替換原則也是對開放封閉原則的一種非常良好的實現,所以我們可以直接用《嘻哈說:里氏替換原則》中的場景以及程式碼。

3、場景

八大菜系的廚師

番茄餐廳,經過兢兢業業的經營,從一家小型的餐館成長為一家大型餐廳。

廚師:老闆,我們們現在家大業大客流量也大,雖然我精力充沛,但我也架不住這麼多人的摧殘。

老闆:摧殘?你確定?

廚師:哪能,您聽錯了,是照顧,架不住這麼多人的照顧。

老闆:小火雞,可以呀,求生欲很強嘛。那你有什麼想法?

廚師:我覺得我們們可以引入八大菜系廚師,一來,什麼菜系的菜就交給什麼菜系的廚師,味道質量會更加的上乘,才能配的上我們這麼高規格的餐廳。

老闆:嗯,說的有點道理,繼續說。

廚師:二來,人手多了,還可以增加上菜的速度,三來......

老闆:有道理,馬上招聘廚師,小火雞,恭喜你,升官了,你就是未來的廚師長。因為你求生欲真的很強。

廚師長:謝謝老闆。(內心:我求生欲很強?哪裡強了?放學你別走,我讓你嚐嚐我的厲害,給你做一桌子好菜)

求生欲果真很強。

4、實現

package com.fanqiekt.principle.liskov;

/**
 * 抽象廚師類
 *
 * @author 番茄課堂-懶人
 */
public abstract class Chef {
    /**
     * 做飯
     * @param dishName 餐名
     */
    public void cook(String dishName){
        System.out.println("開始烹飪:"+dishName);

        cooking(dishName);

        System.out.println(dishName + "出鍋");
    }

    /**
     * 開始做飯
     */
    protected abstract void cooking(String dishName);
}
複製程式碼

抽象廚師類,公有cook方法,負責廚師做飯的一些相同邏輯,例如開始烹飪的準備工作,以及出鍋。

具體做飯的細節則提供一個抽象方法cooking(正在做飯),具體菜系廚師需要重寫該方法。

package com.fanqiekt.principle.liskov;

/**
 * 山東廚師
 *
 * @author 番茄課堂-懶人
 */
public class ShanDongChef extends Chef{
    @Override
    protected void cooking(String dishName) {
        switch (dishName){
            case "蕃茄炒雞蛋":
                cookingTomato();
                break;
            default:
                throw new IllegalArgumentException("未知餐品");
        }
    }

    /**
     * 炒蕃茄雞蛋
     */
    private void cookingTomato() {
        System.out.println("先炒雞蛋");
        System.out.println("再炒蕃茄");
        System.out.println("...");
    }
}
複製程式碼

魯菜廚師ShanDongChef繼承了廚師抽象類Chef,實現了抽象方法cooking。

新增蕃茄炒雞蛋的功能,我們可以通過繼承Chef抽象類實現ShanDongChef類進行擴充套件,這就是對擴充套件開放

避免修改Chef類,從而避免修改給原有系統帶來新的問題,這就是對修改封閉

5、嘻哈說

接下來,請您欣賞開放封閉原則的原創歌曲

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

對擴充套件開放
對修改封閉
對具體來講
要大膽痛擊
對抽象愛上
程式設計就會容易
開放封閉我中意瘋迷
做番茄雞蛋可以新增山東大廚
而不是在廚師類裡大修大補
否則程式碼就像狂風中的蠟燭
隨時可能一命嗚呼
複製程式碼

試聽請點選這裡

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

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

番茄課堂,學習也要酷。

相關文章