??? 雖然一直覺得 interface 和abstract其實(shí)各自作用不同,而且有各自所適應(yīng)的情況。但是就是說(shuō)不清楚,他們?cè)谑褂脮r(shí)應(yīng)該在注意的區(qū)別。
??? 看了 Erich Gamma的說(shuō)法,恍然大悟。java interface作為接口時(shí)是應(yīng)該相對(duì)穩(wěn)定的。一旦你修改了一個(gè)接口,其實(shí)現(xiàn)都會(huì)作廢,需要按照從新修改來(lái)遵守這個(gè)已發(fā)布的契約。而從,領(lǐng)域抽象的角度來(lái)看。java 中的interface 應(yīng)該作為一個(gè)行為契約來(lái)用。所以,只有相對(duì)穩(wěn)定的行為集可以作為一個(gè)接口公告和契約發(fā)布出來(lái),讓client調(diào)用,這才是java interface的真實(shí)含義。比如,發(fā)布一個(gè)Transcation interface作為,事務(wù)行為契約再好不過(guò)了。
??? 而abstract作為接口時(shí)是相對(duì)穩(wěn)定性是寬松的。如果你想增加一個(gè)方法,來(lái)讓一個(gè)比較特殊的實(shí)例來(lái)作為實(shí)現(xiàn)。你可以直接在抽象方法實(shí)現(xiàn)一個(gè)默認(rèn)方法,這樣其他子類就不會(huì)受到較大的牽連。從領(lǐng)域抽象的角度來(lái)說(shuō),對(duì)象既可以描述實(shí)體也可以描述行為。然而,通常一旦描述行為,使用整個(gè)對(duì)象來(lái)描述一個(gè)整體行為的(注意不是一個(gè)行為集)。所以,總體來(lái)說(shuō),abstract應(yīng)該用以描述內(nèi)部行為相對(duì)不太確定的實(shí)體,或內(nèi)部子行為不太確定的行為的。比如,java collection框架中的AbstractList
??? Erich Gamma: 接口提取出對(duì)象之間的協(xié)作關(guān)系。接口是獨(dú)立于實(shí)現(xiàn)細(xì)節(jié)的,而且它定義了協(xié)作的語(yǔ)匯(vocabulary)。一旦我理解了接口,我就理解了系統(tǒng)的大部分。為什么?因?yàn)楫?dāng)我理解了所有接口以后,我應(yīng)該就能夠理解關(guān)于這個(gè)問(wèn)題的語(yǔ)匯。
??? 精辟啊。。。系統(tǒng)分治以后,整個(gè)系統(tǒng)的復(fù)雜度就轉(zhuǎn)化為子系統(tǒng)之間的交互上了。一旦定義了套接口,那么對(duì)于各個(gè)子系統(tǒng)來(lái)說(shuō)已經(jīng)制導(dǎo)整個(gè)系統(tǒng)了,復(fù)雜的問(wèn)題就變得簡(jiǎn)單了。