嘻哈說:開放封閉原則

一、定義

以前咱們已經說過:html

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

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

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

《嘻哈說:接口隔離原則》ide

《嘻哈說:迪米特法則》post

集齊五個原則,就能夠召喚神龍了。學習

神龍就是開放封閉原則,能夠這樣說:它是其餘五大原則的實現,是面向對象設計的終極目標ui

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

一個軟件實體應當對擴展開放,但對修改關閉設計

對擴展開放的意思是,咱們能夠肆無忌憚的增長新功能。

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

能夠說這是寫代碼的最高境界。

遺憾的是,這種狀況不可能發生。需求自己就是在修修改改,程序又是爲需求服務的,代碼不修改是不可能的。

咱們要儘可能作到的開放封閉原則。徹底作到開放封閉原則,臣妾作不到哇!

二、怎麼作

你們能夠思考下:怎麼樣才能作到對擴展開放,對修改封閉呢?

方法1:抽象一個接口或者抽象類,定義公共的方法,從而方便擴展。

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

方法3:接口和抽象類不能修改,能夠繼承接口或者抽象類從而達到擴展的目的。

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

沒錯,就是抽象

咱們應該面向抽象編程,不要面向具體編程。

有沒有似曾相識的感受?

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

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

還有里氏替換原則也是對開放封閉原則的一種很是良好的實現,因此咱們能夠直接用《嘻哈說:里氏替換原則》中的場景以及代碼。

三、場景

八大菜系的廚師

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

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

老闆:摧殘?你肯定?

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

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

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

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

廚師:二來,人手多了,還能夠增長上菜的速度,三來......

老闆:有道理,立刻招聘廚師,小火雞,恭喜你,升官了,你就是將來的廚師長。由於你求生欲真的很強。

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

求生欲果然很強。

四、實現

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類,從而避免修改給原有系統帶來新的問題,這就是對修改封閉

五、嘻哈說

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

嘻哈說:接口隔離原則
做曲:懶人
做詞:懶人
Rapper:懶人

對擴展開放
對修改封閉
對具體來說
要大膽痛擊
對抽象愛上
編程就會容易
開放封閉我中意瘋迷
作番茄雞蛋能夠新增山東大廚
而不是在廚師類裏大修大補
不然代碼就像狂風中的蠟燭
隨時可能一命嗚呼
複製代碼

試聽請點擊這裏

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

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

番茄課堂,學習也要酷。

相關文章
相關標籤/搜索