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

[size=medium]开始学习java知道接口是一个类所具有的方法特征的集合,是一种逻辑上的抽象,它里面定义的方法没有方法体,主要作用就是解决了java类只能单根继承的不足。如:我们可以定义一个跑车接口SportsCar:[/size]

/**
* 定义一个跑车接口
*
*/
public interface SportsCar {
//发动机类型:石油驱动
public void oilEngine();
}
再写一个奔驰汽车类Benz,实现SportsCar接口
/**
* 奔驰汽车
*
*/
public class Benz implements SportsCar {

public void oilEngine() {
System.out.println("采用石油驱动");
}

}


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

/**
* 绿色环保车接口
*
*/
public interface GreenCar {
//发动机类型:太阳能驱动
public void solarEngine();
}
让Benz类同时实现这两上接口,从而使汽车具有双引擎系统的功能:
/**
* 奔驰汽车
*
*/
public class Benz implements SportsCar ,GreenCar{

public void oilEngine() {
System.out.println("采用石油驱动");
}


public void solarEngine() {
System.out.println("采用太阳能驱动");
}

}

[size=medium]通过接口提供了关联以及方法调用上的可插入性,当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,就像我们将一个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了。
虽然自己已经感觉到了不少面向接口编程的好处,但这还只是自己的心得,离真正把这种思想贯彻到编码设计中感觉还是有不少距离,这是一种设计思想,思想是最难的把握的, 对于原理性的东西还要自己好好去琢磨,有自己真正的见解才是真的懂了。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值