1.接口和抽象类的区别

  a.在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,abstract class可以有自己的数据成员,也可以有非abstarct的成员方法,而interface只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。
  b.从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。
  c.从设计理念层面,abstract class和interface是用本质区别的。abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系。

2.什么是面向接口编程

  Martin Fowler在他的分析模式一书中指出,分析问题应该站在概念的层次上,而不是站在实现的层次上。什么叫做概念的层次呢?简单的说就是分析对象该做什么,而不是分析对象怎么做。前者属于分析的阶段,后者属于设计甚至是实现的阶段。在需求工程中有一种称为CRC卡片的玩艺儿,是用来分析类的职责和关系的,其实那种方法就是从概念层次上进行面向对象设计。因此,如果要从概念层次上进行分析,这就要求你从领域专家的角度来看待程序是如何表示现实世界中的概念的。从实现的角度上来说,概念层次对应于合同,合同的实现形式包括接口和基类。简单的说吧,在概念层次上进行分析就是设计出接口(或是基类),而不用关心具体的接口实现(实现推迟到子类再实现)。
   有人说面向对象编程就是面向接口编程,这话一点儿也不假。接口应该体现了面向对象的核心思想在里面,换句话讲应该说接口抽象出具体事物的外在共性,然而不同的类的相同的接口函数的内在实现机制是不同的,这又体现了具体事物的特性。举个例子,对于所有的商店都提供卖东西的功能,这就可以抽象成一个接口,这个接口里面可以提供buy()这个函数,然而各个商店的卖东西是不一样的,也就是BUY()函数实现不一样的!
   通常我们在这种情况下使用接口:
   如果一个类的实例必须使用另一个对象、而这个对象又属于一个特定的类,那么复用性会受到损害。
   如果“使用”类只需要“被使用”类的某些方法、而不是要求“被使用”类与“使用”类有“is-a”的关系,就可以考虑让“被使用”类实现一个接口、“使用”类通过这个接口来使用需要的方法,从而限制了类之间的依赖。
   下面是一个面向接口编程种的三个实体及其关系:
   Client(客户)——使用实现了IndirectionIF的其他类。
   InterdirectionIF(间接接口)——提供间接性,保证Client与Service之间的独立性。
   Service(服务者)——实现IndirectionIF,为Client提供服务。

3.面向接口编程的好处

   让调用者通过接口间接使用服务者,使用Interface模式,可以保证需要服务的类不与任何提供服务的类发生耦合。
   解耦的好处是什么呢?
   首先,程序变得清晰了。
   其次,不该暴露的实现细节被隐藏了。代码的修改变容易了。
   再次,结构灵活了,一个模块可以和任意实现接口的模块协作。原来类A只能与类B协作,解耦后可以和所有实现接口IB的类如B1, B2, ... 协作了。扩展性大大增强。自然而然就代码重用了。
   编译依赖也没有了。你可以专心写和编译一个模块,不用等待其它模块的完成。
   调试容易了。只要模块对一个接口调试成功,其它的接口也没有问题。于是,甚至可以用一个simple naive的实现该接口的dummy类来调试.
转自唐山迪锐IT技术论坛:http://bbs.tsp2c.cn/?fromuid=135