Posted on 2009-03-10 17:30
love1563 閱讀(959)
評(píng)論(0) 編輯 收藏 所屬分類:
設(shè)計(jì)模式
首先,如果沒(méi)有接口會(huì)怎么樣呢?一個(gè)類總歸可以從另一類繼承,難道還不夠么?
沒(méi)接口會(huì)怎么樣
一個(gè)對(duì)象需要知道其他的一些對(duì)象,并且與其他的對(duì)象發(fā)生相互作用,這是因?yàn)檫@些對(duì)象需要借助于其他對(duì)象的行為以便完成一項(xiàng)工作。這些關(guān)于其他對(duì)象的知識(shí),以及對(duì)其他對(duì)象行為的調(diào)用,都是使用硬代碼(Hardcode)寫在類里面的,可插入性幾乎為零。
如果要加入一個(gè)新的類,僅僅意味著加入新的硬代碼,而不能給出動(dòng)態(tài)的可插入行。
那么基于類的繼承是否可以提供一點(diǎn)幫助呢?比如現(xiàn)在有一個(gè)具體類,提供某種使用硬代碼寫在類的行為。現(xiàn)在,要提供一些類似的行為,并且實(shí)現(xiàn)動(dòng)態(tài)的可插入,也就是說(shuō),要能夠動(dòng)態(tài)地決定使用那種實(shí)現(xiàn)。一個(gè)可能的做法就是為這個(gè)類提供一個(gè)抽象超類,生命出子類要提供的行為,然后讓這個(gè)具體類繼承自這個(gè)抽象超類。同時(shí),為這個(gè)抽象超類提供另一個(gè)具體子類,這個(gè)子類以不同的方法實(shí)現(xiàn)了超類所生命的行為。客戶端可以動(dòng)態(tài)決定那個(gè)具體子類。這是否可以提供可插入性呢?
答案是,這卻是可以在簡(jiǎn)單的情況下提供可插入性。但是由于java語(yǔ)言是一個(gè)單繼承的語(yǔ)言,換言之,一個(gè)類只能有一個(gè)超類,因此,在很多情況下,這個(gè)具體類可能已經(jīng)有了以超類,這時(shí)候,要給它加上一個(gè)新的超類是不可能的,如果硬要加的話,就只好把這個(gè)新的超類加到已有的超類上面,形成超超類的情況;如果這個(gè)超超類的位置已經(jīng)被占用了,就只好繼續(xù)向上移動(dòng),直到移動(dòng)到類等級(jí)結(jié)構(gòu)的最頂端。這樣一來(lái),對(duì)一個(gè)具體類的可插入性設(shè)計(jì),就變成了對(duì)整個(gè)等級(jí)結(jié)構(gòu)中所有的類的修改。
這還是假設(shè)這些超類都是在設(shè)計(jì)師控制之下的。如果這些超類是一些軟件商提供的,設(shè)計(jì)師無(wú)法修改,怎么辦呢?如果有一個(gè)具體類,它有一個(gè)超類是Frame,那么新加入的超類就只好一直向上移動(dòng)到j(luò)ava.lang.Object類上面,這怎么可能呢?
因此,沒(méi)有接口可插入性就沒(méi)有保證。
接口是對(duì)可插入性的保證
接口使可插入性變得可能。
在一個(gè)類等級(jí)結(jié)構(gòu)中的任何一類可以實(shí)現(xiàn)一個(gè)接口,這個(gè)接口會(huì)影響到此類的所有子類,但是不會(huì)影響到此類的任何超類。此類將不得不實(shí)現(xiàn)這個(gè)接口所規(guī)定的方法,而其子類則可以從此類自動(dòng)繼承到這些方法,當(dāng)然也可以選擇置換掉所有的這些方法,或者其中的某一些方法。
這時(shí)候,這些子類就具有了可插入性。
關(guān)聯(lián)的可插入性
正如前面所說(shuō)的,一個(gè)對(duì)象需要完成一項(xiàng)任務(wù),所以需要知道其他的對(duì)象,并且調(diào)用其他對(duì)象的方法。這個(gè)對(duì)象對(duì)其他對(duì)象的知識(shí)叫做關(guān)聯(lián)(Association)。
如果一個(gè)關(guān)聯(lián)不是針對(duì)一個(gè)具體類的,而是針對(duì)一個(gè)接口的,那么任何實(shí)現(xiàn)這個(gè)接口的類就都可以滿足要求。換言之,當(dāng)前對(duì)象并不在意所關(guān)聯(lián)的是哪一個(gè)具體類。而僅僅關(guān)心這個(gè)類是否實(shí)現(xiàn)了某一個(gè)借口。
這樣一來(lái),就可以動(dòng)態(tài)地將這個(gè)關(guān)聯(lián)從一個(gè)具體類轉(zhuǎn)換到另一個(gè)具體類,而這樣做的唯一條件是它們都實(shí)現(xiàn)某個(gè)接口。
調(diào)用的可插入性
同樣,一個(gè)對(duì)象不可避免地需要調(diào)用其他對(duì)象的方法。這種調(diào)用不一定飛的是某一個(gè)具體類,而可以是一個(gè)接口。這樣一來(lái),任何實(shí)現(xiàn)了這個(gè)接口的具體類都可以被當(dāng)前對(duì)象調(diào)用;而當(dāng)前對(duì)象到底調(diào)用的是哪一個(gè)具體的實(shí)例則完全可以動(dòng)態(tài)地決定。
因此,接口提供了關(guān)聯(lián)以及方法調(diào)用上的可插入性,軟件系統(tǒng)的規(guī)模越大,生命周期越長(zhǎng),接口的重要性就越大。接口使得軟件系統(tǒng)在靈活性和可擴(kuò)展性、可插入性方面得到保證。