虽然一直觉得 interface 和abstract其实各自作用不同,而且有各自所适应的情况。但是就是说不清楚,他们在使用时应该在注意的区别。
    看了 Erich Gamma的说法,恍然大悟。java interface作为接口时是应该相对稳定的。一旦你修改了一个接口,其实现都会作废,需要按照从新修改来遵守这个已发布的契约。而从,领域抽象的角度来看。java 中的interface 应该作为一个行为契约来用。所以,只有相对稳定的行为集可以作为一个接口公告和契约发布出来,让client调用,这才是java interface的真实含义。比如,发布一个Transcation interface作为,事务行为契约再好不过了。
    而abstract作为接口时是相对稳定性是宽松的。如果你想增加一个方法,来让一个比较特殊的实例来作为实现。你可以直接在抽象方法实现一个默认方法,这样其他子类就不会受到较大的牵连。从领域抽象的角度来说,对象既可以描述实体也可以描述行为。然而,通常一旦描述行为,使用整个对象来描述一个整体行为的(注意不是一个行为集)。所以,总体来说,abstract应该用以描述内部行为相对不太确定的实体,或内部子行为不太确定的行为的。比如,java collection框架中的AbstractList
    Erich Gamma: 接口提取出对象之间的协作关系。接口是独立于实现细节的,而且它定义了协作的语汇(vocabulary)。一旦我理解了接口,我就理解了系统的大部分。为什么?因为当我理解了所有接口以后,我应该就能够理解关于这个问题的语汇。
    精辟啊。。。系统分治以后,整个系统的复杂度就转化为子系统之间的交互上了。一旦定义了套接口,那么对于各个子系统来说已经制导整个系统了,复杂的问题就变得简单了。