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