《JAVA與模式》重讀心得和筆記 <一. 設計模式簡言>
閻宏的《JAVA與模式》,本來已經在書堆里面塵封了。之前第一遍看過后,有些地方覺得比較抽象,也沒細體會。
一晃兩年過去,偶然因為一個設計模式的疑惑,把它又找出來了(書很多,找得很辛苦)。重讀這本書時,感覺理解
起來和兩年前完全不同了,幾十頁一氣呵成。很久沒有這種讀書的狀態了。于是決定從頭再讀,讀了還不算,順便記點
筆記,貽笑大方。
一節,設計模式的一些基礎概念。大概都是些老生常談的東西,但缺少它,就不是完整的筆記了。所以題目叫簡言。
=================================================================================
Peter Coad 軟件設計目標:
1. 可擴展性(Extensibility)
新的功能可以很容易的加入到系統
2. 靈活性(Flexibility)
可以允許代碼修改平穩地發生,而不會設計到很多其他的模塊
3. 可插入性(Pluggability)
可以很容易地將一個類抽出去,同時將另一個有同樣接口的類加入進來
達成理想軟件設計目標的關鍵是設計的抽象化。
抽象化的基石:接口和抽象類
一、接口 (Interface)
接口是實現構件的可插入性(Pluggability)的關鍵。
1. 接口保證關聯的可插入性
通過接口,我們可以實現動態切換一個類到另一個類的關聯關系。 比如 類A 關聯了類 B,
如果需求更改,類 A 需要關聯類 C,我們只有修改類A 的代碼。 如果類B和類C行為相似,
那我們可以提煉出接口 E。類A 只需要關聯到接口E,就可以在不修改代碼的情況下,自由
切換類A與類B或者類C的關聯關系。
2. 接口保證調用的可插入性
同樣,一個對象不可避免地需要調用其他對象的方法。這種調用不一定非得是某一個具體類,
而可以是一個接口。這樣一來,任何實現了這個接口的具體類都可以被當前對象調用;而當前
對象到底調用的是哪一個具體類的實例則完全可以動態地決定。
因此,接口提供了關聯以及方法調用上的可插入性,軟件系統的規模越大,生命周期越長,接口
的重要性就越大。接口使得軟件系統在靈活性和可擴展性、可插入性方面得到保證。
接口的分類:
1. 單方法接口。 如 Runnable
2. 標識接口。如 Serializable、java.rmi.Remote
3. 常量接口。 不推薦
二、抽象類 (Abstract Class)
抽象類的重要設計原則:
1. 抽象類是用來繼承的;具體類不是用來繼承的
2. 抽象類應該擁有盡可能多的共同代碼 (代碼復用、節約內存資源)
3. 抽象類應該擁有盡可能少的數據 (節省內存資源)
接口與抽象類的優缺比較:
1. 兩者最大的區別,java 抽象類可以提供某些方法的部分實現,而java接口則不可以。
2. 子類只能繼承一個抽象類,但可以實現多個接口。
3. 代碼重構方面。將一個單獨的java具體類重構成一個java接口的實現是很容易的,
而為一個已有的具體類添加一個java抽象類作為抽象類型取不那么容易,因為這個
具體類有可能已經有了一個超類。
4. java接口是定義混合類型(Mixin Type)的理想工具。所謂混合類型,就是在一個類
的主類型之外的次要類型。一個混合類型表明一個類不僅僅具有某個主類型的行為,
而且具有其他的次要行為。比如 Hashtable
聯合使用java接口和java抽象類:
由于java抽象類具有提供缺省實現的優點,而java接口具有其他所有的優點。因此聯合使用
兩者就是一個很好的選擇。
首先,聲明類型的工作仍然是java接口承擔的,但是同時給出的還有一個java抽象類,為這個
接口給出一個缺省實現。其他同屬于這個抽象類型的具體類可以選擇實現這個java接口,也可
以選擇繼承自這個抽象類。
這其實就是缺省適配模式(Default Adapter)。Java API 中也用了這種缺省適配模式,而且全都
遵循一定的命名規范:Abstract + 接口名。比如接口Collection,抽象類的名字是AbstractCollection。
這種聯合使用接口和抽象類的做法,可以充分利用兩者的優點,克服兩者的缺點。
posted on 2007-08-17 16:22 Samuel.Mo 閱讀(305) 評論(0) 編輯 收藏 所屬分類: Java設計模式