里氏代換原則
從里氏代換原則中可以看出面向對象設計的重要原則-創建抽象化,並從抽象化導出具體化。
核心:如果一個軟件實體使用的是一個基類的話,那麼這個地方一定也適合其它子類,而且無法察覺基類對象和子類對象的區別。
注意:反過來的代換是不成立的。如果一個軟件實體使用的是子類的話,那麼它們不一定適用於基類。
Java對里氏代換的支持
最簡單明瞭的地方就是一個base基類中聲明的public方法在子類中無法降級訪問權限。
Java對里氏代換的侷限
java的編譯器還是有侷限的。舉個栗子,描寫一個物體大小的量有精度和準確度兩種屬性。所謂精度,即這個數字有多少位;而準確度就是與真實的物體大小相符合到什麼程度。一個量可以有很高的精度,但卻無法與真實物體的情況吻合。Java編譯器所能檢查的,僅僅是相當於精度的屬性而已,它無法檢查這個量與真實物體的差距。
里氏代換與設計模式
策略模式 :如果有一組算法,那麼就將每一個算法封裝起來,使它們可以互換。舉個栗子: A是B的基類 則可以 A a = new B();
合成模式:通過使用樹結構描述整體與部分關係,從而可以將單純元素與複合元素同等看待。由於單純元素和複合元素都是抽象元素的子類,因此兩者都可以替代抽象元素出現在任何地方。(里氏代換原則是合成模式能夠成立的基礎)...
代理模式: 給某一個對象提供代理對象,並由代理對象控制對原對象的引用。代理模式能夠成立是因爲,代理模式與真實主題模式都是抽象主題角色的子類。客戶端只知道抽象主題,而代理主題可以代替抽象主題出現在任何需要的地方,而將真實主題隱藏起來。
依賴倒轉原則
要依賴於抽象,不要依賴於具體。
85.96
接口隔離原則
使用多個專門對的接口比使用單一的總接口要好。
一個類與另一個類的依賴性應當是建立在最小的接口上。
定製:爲同一個角色提供寬、窄不一的接口,以滿足不同的客戶端需求。
污染:過於臃腫的接口是對接口的污染。
定製原則拒絕向客戶端提供不需要提供的行爲,這一點符合迪米特原則。
定製服務栗子
備忘錄模式
用意是不破壞封裝的前提下,捕捉一個對象的狀態,並將之外部化,從而可以在將來合適的時機把這個對象還原到存儲起來的狀態。
在這裏 不破壞 是重點,爲實現這一點,該對象需要向外界提供雙重接口,即一窄一寬兩個接口。
迭代子模式
提供一個迭代子對象,使客戶端可以順序訪問一個聚集中的元素,而不必暴露聚集的內部表象。具體後面會講...
合成/聚合複用原則
在一個新的對象裏面使用一些已有的對象,使之成爲新的對象的一部分;新的對象通過向這些對象的委派以達到複用的目的。
通過繼承達到複用的目的
繼承是面向對象的語言特有的複用工具,而且是最容易被濫用的複用工具。
繼承複用的優點: 1.新的實現較爲容易,因爲超類大部分功能可以通過複用進入子類 2.修改或擴展繼承而來的實現較爲容易
繼承複用的缺點: 1.繼承複用破壞包裝,因爲繼承將超類的實現細節暴露給子類。由於超類的內部細節常常是對子類透明的,因此這種複用又稱爲透明覆用,即“白箱”複用。 2.如果超類改變,子類也不得不改變。 3. 從超類繼承來的實現是靜態的,不可能在運行時間內發生改變,因此沒有足夠的靈活性。
...