一個軟體設計的好壞,我想很大程度上取決於它的整體架構,而這個整體架構其實就是你對整個宏觀商業業務的抽象架構,當代表商務邏輯的高層抽象層結構 合理時,你底層的具體實現需要考慮的就僅僅是一些演算法和一些具體的業務實現了。當你需要再開發另一個相近的項目時,你以前的抽象層說不定還可以再次利用 呢,面對對象的設計,複用的重點其實應該是抽象層的複用,而不是具體某一個代碼塊的複用,是不是一下子感覺自己對複用理解的高度又上升了一層?^_^
說到了抽象,我就不能不提到曾讓我頭痛的Java介面和Java抽象類別了,這也是本文我想說的重點。
既然物件導向設計的重點在於抽象,那Java介面和Java抽象類別就有它存在的必然性了。
Java介面和Java抽象類別代表的就是抽象類別型,就是我們需要提出的抽象層的具體表現。OOP物件導向的編程,如果要提高程式的複用率,增加程式 的可維護性,可擴充性,就必須是面向介面的編程,面向抽象的編程,正確地使用介面、抽象類別這些太有用的抽象類別型做為你結構層次上的頂層。
Java介面和Java抽象類別有太多相似的地方,又有太多特別的地方,究竟在什麼地方,才是它們的最佳位置呢?把它們比較一下,你就可以發現了。
1、Java介面和Java抽象類別最大的一個區別,就在於Java抽象類別可以提供某些方法的部分實現,而Java介面不可以,這大概就是Java抽象類別唯一的優點吧,但這個優點非常有用。
如 果向一個抽象類別裡加入一個新的具體方法時,那麼它所有的子類都一下子都得到了這個新方法,而Java介面做不到這一點,如果向一個Java介面裡加入一個 新方法,所有實現這個介面的類就無法成功通過編譯了,因為你必須讓每一個類都再實現這個方法才行,這顯然是Java介面的缺點。
2、一個抽象類別的實現只能由這個抽象類別的子類給出,也就是說,這個實現處在抽象類別所定義出的繼承的等級結構中,而由於Java語言的單繼承性,所以抽象類別作為類型定義工具的效能大打折扣。
在這一點上,Java介面的優勢就出來了,任何一個實現了一個Java介面所規定的方法的類都可以具有這個介面的類型,而一個類可以實現任意多個Java介面,從而這個類就有了多種類型。
3、從第2點不難看出,Java介面是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。
4、結合1、2點中抽象類別和Java介面的各自優勢,具精典的設計模式就出來了:宣告類型的工作仍然由Java介面承擔,但是同時給出一個Java 抽象類別,且實現了這個介面,而其他同屬於這個抽象類別型的具體類可以選擇實現這個Java介面,也可以選擇繼承這個抽象類別,也就是說在階層中,Java 介面在最上面,然後緊跟著抽象類別,哈,這下兩個的最大優點都能發揮到極至了。這個模式就是“預設適配模式”。
在Java語言API中用了這種模式,而且全都遵循一定的命名規範:Abstract +介面名。
Java介面和Java抽象類別的存在就是為了用於具體類的實現和繼承的,如果你準備寫一個具體類去繼承另一個具體類的話,那你的設計就有很大問題了。Java抽象類別就是為了繼承而存在的,它的抽象方法就是為了強制子類必須去實現的。
使用Java介面和抽象Java類進行變數的型別宣告、參數是型別宣告、方法的返還類型說明,以及資料類型的轉換等。而不要用具體Java類進行變數的型別宣告、參數是型別宣告、方法的返還類型說明,以及資料類型的轉換等。