設計原則名稱
定??義
使用頻率
單一職責原則(Single Responsibility Principle, SRP)
一個類只負責一個功能領域中的相應職責。
★★★★☆
開閉原則(Open-Closed Principle, OCP)
軟件實體應對擴展開放,而對修改關閉。開閉原則的關鍵在于抽象化。
★★★★★
里氏代換原則(Liskov Substitution Principle, LSP)
所有引用基類對象的地方能夠透明地使用其子類的對象【子類不應該覆蓋父類的非抽象方法】。里氏代換原則是實現開閉原則的重要方式之一
★★★★★
依賴倒轉原則(Dependence? Inversion Principle, DIP)
抽象不應該依賴于細節,細節應該依賴于抽象。是開閉原則的基礎。【可以通過依賴注入的方式實現】
★★★★★
接口隔離原則(Interface Segregation Principle, ISP)
使用多個專門的接口,而不使用單一的總接口。【需要把控好接口的粒度】
★★☆☆☆
合成復用原則(Composite Reuse Principle, CRP)
復用時要盡量使用組合/聚合關系(關聯關系),少用繼承。
★★★★☆
迪米特法則(最少知道)(Law of Demeter, LoD)
一個軟件實體應當盡可能少地與其他實體發生相互作用。
★★★☆☆
里氏代換原則
里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范。需要注意以下幾點:
(1)子類的所有方法必須在父類中聲明,或子類必須實現父類中聲明的所有方法。
(2)盡量把父類設計為抽象類或者接口,讓子類繼承父類或實現父接口,并實現在父類中聲明的方法。
(3)子類不應該覆蓋父類的非抽象方法(可以重載,但一定要調父類的方法)。
依賴倒轉原則
在實現依賴倒轉原則時,我們需要針對抽象層編程,而將具體類的對象通過依賴注入的方式注入到其他對象中,依賴注入是指當一個對象要與其他對象發生依賴關系時,通過抽象來注入所依賴的對象。常用的注入方式有三種,分別是:構造注入,設值注入(Setter注入)和接口注入。
(1)構造注入是指通過構造函數來傳入具體類的對象。
(2)設值注入是指通過Setter方法來傳入具體類的對象。
(3)接口注入是指通過在接口中聲明的業務方法來傳入具體類的對象。
這些方法在定義時使用的是抽象類型,在運行時再傳入具體類型的對象,由子類對象來覆蓋父類對象。
開閉原則是目標,里氏代換原則是基礎,依賴倒轉原則是手段。
接口隔離原則
(1)在使用接口隔離原則時,我們需要注意控制接口的粒度。
(2)接口不能太小。如果太小會導致系統中接口泛濫,不利于維護;
(3)接口也不能太大。太大的接口將違背接口隔離原則,靈活性較差,使用起來很不方便。
一般而言,接口中僅包含為某一類用戶定制的方法即可,不應該強迫客戶依賴于那些它們不用的方法。
合成復用原則
通過繼承來進行復用的主要問題在于繼承復用會破壞系統的封裝性。因為繼承會將基類的實現細節暴露給子類,由于基類的內部細節通常對子類來說是可見的,所以這種復用又稱“白箱”復用,如果基類發生改變,那么子類的實現也不得不發生改變;從基類繼承而來的實現是靜態的,不可能在運行時發生改變,沒有足夠的靈活性。
一般而言,如果兩個類之間是“Has-A”的關系應使用組合或聚合,如果是“Is-A”關系可使用繼承。"Is-A"是嚴格的分類學意義上的定義,意思是一個類是另一個類的"一種";而"Has-A"則不同,它表示某一個角色具有某一項責任。
Java設計模式詳解
項目源碼
微信公眾號
> 更多資訊內容,歡迎掃描關注我的個人微信公眾號!