OCP(Open - Colse Principle) 開放-封閉原則:
軟件實體(類、模塊、函數等等)應該是可以對模塊進行快速擴展的,但是不可修改的。
遵循OCP原則的模塊具有兩個主要特徵.他們是:
1. "對於擴展是開放的"(Open for extension)
這意味着模塊的行爲是可以擴展的。當應用的需求改變是,我們可以擴展,使其具有滿足哪些改變的新行爲。換句話說,我們可以改變模塊的功能。
2. "對於更改是封閉的"(Close for modification)"。
對模塊進行擴展時,不必改動模塊的源代碼或者二進制代碼。模塊的二進制代碼可執行版本,無論時可連接的庫、dll或者java的.jar文件都無需改動。
OCP背後的機制主要是抽象(abstraction)和多態(polymorphism)。
LSP(Liskov Substitution Principle) 里氏替換原則:
子類型(subtype)必須能夠替換掉他們的基類型(base type)。 若對每個類型S的對象O1,都存在一個類型T的對象O2,使得在所有針對T編寫的程序P中,用O1替換O2後,程序P行爲功能不變,則S是T的子類型。
DIP(Dependency-Inversion Principles) 依賴倒置原則:
1.高層模塊不應該依賴於低層模塊。二者都應該依賴於抽象。
2.抽象不應該依賴於細節, 細節應該依賴於抽象。
由DIP可知:
任何變量都不應該持有一個指向具體類的指針或者引用.
任何類都不應該從具體類派生。
任何方法都不應該複寫它的基類中的已經實現的方法。
ISP (Interface Segregation Principles) 接口隔離原則:
不要強迫客戶依賴於它們不用的方法。接口屬於客戶,不屬於它所在的類層次結構。
如果強迫客戶程序依賴於那些它們不使用的方法,那麼這些客戶程序就面臨着由於這些未使用方法的改變所帶來的變更。這無意中導致了所有客戶程序之間的耦合。換句話說,如果一個客戶程序依賴於一個含有它不使用的方法的類,但是其他客戶程序卻要使用該方法,那麼當其他客戶要求這個類改變時,就會影響到這個客戶程序。我們希望儘可能地避免這種耦合,因此我們希望分離接口。