在沒有好好地研習物件導向設計的設計模式之前,我對Java介面和Java抽象類別的認識還是很模糊,很不可理解。
剛學Java語言時,就很難理解為什麼要有介面這個概念,雖說是可以實現所謂的多繼承,可一個只有方法名,沒有方法體的東西,我實現它又有什麼用呢?我從它那什麼也得不到,除了一些方法名,我直接在具體類裡加入這些方法不就行了嗎?
為什麼一定要有抽象類別這個概念?為什麼就不能把這個父類寫成一個具體的類,子類再繼承它不就可以了嗎?何必弄一個抽象類別出來,還要弄一些沒有方法體的抽象方法,弄得又象介面又象類的,讓人捉摸不定。
當我開始學習java設計模式,真正走進物件導向設計的大門之後,我才發現,自己對物件導向設計的理解原來是那麼的片面,那麼的膚淺,根本就沒有真正理解物件導向思想的精髓,在某一種程度上還受著面向過程的影響,以為弄出了一個個類,就算是物件導向了,而其實還是被過程所驅使著。
我還是說說我現在對物件導向思想的理解吧,不一定正確全面,但我想應該還算是比以前略有進步吧。
物件導向思想,我覺得最關鍵的就是抽象。
一個軟體設計的好壞,我想很大程度上取決於它的整體架構,而這個整體架構其實就是你對整個宏觀商業業務的抽象架構,當代表商務邏輯的高層抽象層結構
合理時,你底層的具體實現需要考慮的就僅僅是一些演算法和一些具體的業務實現了。當你需要再開發另一個相近的項目時,你以前的抽象層說不定還可以再次利用
呢,面對對象的設計,複用的重點其實應該是抽象層的複用,而不是具體某一個代碼塊的複用,是不是一下子感覺自己對複用理解的高度又上升了一層?^_^
說到了抽象,我就不能不提到曾讓我頭痛的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類進行變數的型別宣告、參數是型別宣告、方法的返還類型說明,以及資料類型的轉換等。
我想,如果你編的代碼裡面連一個介面和抽象類別都沒有的話,也許我可以說你根本沒有用到任何設計模式,任何一個設計模式都是和抽象分不開的,而抽象與Java介面和抽象Java類又是分不開的。
理解抽象,理解Java介面和抽象Java類,我想就應該是真正開始用物件導向的思想去分析問題,解決問題了吧。