理解何为面向接口编程,重新认识接口 不指定

Heck post in 编程杂谈 2010/08/24 23:52 评论(0) 阅读(925) | |
     shy刚开始学习java知道接口是一个类所具有的方法特征的集合,是一种逻辑上的抽象,它里面定义的方法没有方法体,主要作用就是解决了java类只能单根继承的不足81。如:我们可以定义一个跑车接口SportsCar:



像这样我们也可以把SportsCar定义为一个类,让Benz类去继承它,也可以实现,但如果科技进步了,人类环保意识加强了,出现了绿色环保车型,即采用太阳能作为发动机,而奔驰公司也为了体现这点,给汽车装上了双引擎系统。那么再定义一个GreenCar类,让Benz去继承就不行了,因为java是单根继承,所以只能把GreenCar定义为一个接口:



通过接口提供了关联以及方法调用上的可插入性,当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,就像我们将一个60G硬盘换成一个160G的硬盘,计算机其他地方不用做任何改动,而是把原硬盘拔下来、新硬盘插上就行了,因为计算机其他部分不依赖具体硬盘,而只依赖一个IDE接口,只要硬盘实现了这个接口,就可以替换上去。

   虽然接口的好处是毋庸置疑的,可是自己在实际项目开发过程中很少体现面向接口的编程思想,很多时候自己在接口里面定义了一个方法,马上就把想到怎样去实现它,其实自己的注意力一直在实现层,有时候觉得接口这玩意儿有个屁用。其实这是自己的误区,没有真正从一个高度理解接口的内涵,面向接口编程体现的是一种设计,如果一个项目没有好的设计,就算成功了它的扩展性也不好。

   那么面向接口编程到底有什么好处呢?
   1.使用接口编程,易于程序的扩展
   理解面向接口编程一个很好的实例就是java自带的数据库连接接口的定义,假如我们现在要写一个连接数据库的类给用户使用,一般的解决办法是给每个数据库写一个类,然后根据用户使用的数据库类型确定使用具体的类,这样的话必然造成代码的重复,另外也不利于系统的扩展,因为你根本不知道用户使用什么样的数据库,可能是MySQL,可能是Oracle,大家都知道eclipse它可以连接很多数据库,只要你把相应的驱动包加进来,就可以实现连接多种数据库了,想一想这是为什么,因为java里面把Connection定义为了接口,接口是什么,在这里其实就一个标准了,真正的实现其实是交给了数据库的开发方,这个实现类中实现了Connection接口,不信看驱动包中
Connection类的源码:
public class Connection extends ConnectionProperties implements
java.sql.Connection
{

}
那么不管以后还出现什么样的数据库,只要它实现了Sun公司制定的个接口就都可以连接的上,这样让eclipse得到的广泛的应用
   2.降低了程序之间的耦合性
   大家玩过游戏的都知道,很多游戏从它发布开始,就会每隔一段时间进行更新,有时还会增加游戏角色等,使玩家时刻保持新鲜感。那么游戏里面肯定是定义了很多的接口,我增加一个角色只要实现这个角色的接口就可以了,只要通过编译后,就可以把它加到服务器中去就新增了一角色,你想要是没有接口,这游戏还能玩的下去吗?
   3.便于项目的模块化管理,不形成编译的依赖性
   因为现在都讲究团队合作精神,做项目也是一样,很多项目都不可能由你一个人来完成,肯定是很多人分工合作,分模块的来完成工作,每个模块都是独立的,尤其到项目快完成的时候并不要把所有模块组合起来编译一把,然后再运行,只要每个独立模块编译通过就OK了。
   虽然自己已经感觉到了不少面向接口编程的好处,但这还只是自己的心得,离真正把这种思想贯彻到编码设计中感觉还是有不少距离,这是一种设计思想,思想是最难的把握的, 对于原理性的东西还要自己好好去琢磨,有自己真正的见解才是真的懂了。
  

来源:Heck's Blog
地址:http://www.hecks.tk/oriented-interface-html/
转载时须以链接形式注明作者和原始出处及本声明,否则将追究法律责任,谢谢配合!