以前咱們已經說過: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:懶人
對擴展開放
對修改封閉
對具體來說
要大膽痛擊
對抽象愛上
編程就會容易
開放封閉我中意瘋迷
作番茄雞蛋能夠新增山東大廚
而不是在廚師類裏大修大補
不然代碼就像狂風中的蠟燭
隨時可能一命嗚呼
複製代碼
閒來無事聽聽曲,知識已填腦中去;
學習複習新方式,頭戴耳機不小覷。
番茄課堂,學習也要酷。