再探Java與模式(三)

里氏代換原則

從里氏代換原則中可以看出面向對象設計的重要原則-創建抽象化,並從抽象化導出具體化。

核心:如果一個軟件實體使用的是一個基類的話,那麼這個地方一定也適合其它子類,而且無法察覺基類對象和子類對象的區別。

注意:反過來的代換是不成立的。如果一個軟件實體使用的是子類的話,那麼它們不一定適用於基類。

Java對里氏代換的支持

最簡單明瞭的地方就是一個base基類中聲明的public方法在子類中無法降級訪問權限。

Java對里氏代換的侷限

java的編譯器還是有侷限的。舉個栗子,描寫一個物體大小的量有精度和準確度兩種屬性。所謂精度,即這個數字有多少位;而準確度就是與真實的物體大小相符合到什麼程度。一個量可以有很高的精度,但卻無法與真實物體的情況吻合。Java編譯器所能檢查的,僅僅是相當於精度的屬性而已,它無法檢查這個量與真實物體的差距。

里氏代換與設計模式

策略模式 :如果有一組算法,那麼就將每一個算法封裝起來,使它們可以互換。舉個栗子: A是B的基類   則可以 A a = new B(); 

合成模式:通過使用樹結構描述整體與部分關係,從而可以將單純元素與複合元素同等看待。由於單純元素和複合元素都是抽象元素的子類,因此兩者都可以替代抽象元素出現在任何地方。(里氏代換原則是合成模式能夠成立的基礎)...

代理模式:  給某一個對象提供代理對象,並由代理對象控制對原對象的引用。代理模式能夠成立是因爲,代理模式與真實主題模式都是抽象主題角色的子類。客戶端只知道抽象主題,而代理主題可以代替抽象主題出現在任何需要的地方,而將真實主題隱藏起來。

依賴倒轉原則

要依賴於抽象,不要依賴於具體。

85.96

接口隔離原則

使用多個專門對的接口比使用單一的總接口要好。

一個類與另一個類的依賴性應當是建立在最小的接口上。

定製:爲同一個角色提供寬、窄不一的接口,以滿足不同的客戶端需求。

污染:過於臃腫的接口是對接口的污染。

定製原則拒絕向客戶端提供不需要提供的行爲,這一點符合迪米特原則。

定製服務栗子

備忘錄模式

用意是不破壞封裝的前提下,捕捉一個對象的狀態,並將之外部化,從而可以在將來合適的時機把這個對象還原到存儲起來的狀態。

在這裏 不破壞 是重點,爲實現這一點,該對象需要向外界提供雙重接口,即一窄一寬兩個接口。

迭代子模式

提供一個迭代子對象,使客戶端可以順序訪問一個聚集中的元素,而不必暴露聚集的內部表象。具體後面會講...

合成/聚合複用原則

在一個新的對象裏面使用一些已有的對象,使之成爲新的對象的一部分;新的對象通過向這些對象的委派以達到複用的目的。

通過繼承達到複用的目的

繼承是面向對象的語言特有的複用工具,而且是最容易被濫用的複用工具。

繼承複用的優點: 1.新的實現較爲容易,因爲超類大部分功能可以通過複用進入子類   2.修改或擴展繼承而來的實現較爲容易

繼承複用的缺點: 1.繼承複用破壞包裝,因爲繼承將超類的實現細節暴露給子類。由於超類的內部細節常常是對子類透明的,因此這種複用又稱爲透明覆用,即“白箱”複用。  2.如果超類改變,子類也不得不改變。  3. 從超類繼承來的實現是靜態的,不可能在運行時間內發生改變,因此沒有足夠的靈活性。

...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章