为什么写这篇文章
今天有人问了我这样一个问题
Java中为什么要使用接口呢?
还要先定义了一个接口,类还要实现接口的方法,还不如直接在这个类中写实现方法呢,根本没必要定义接口啊。
大概就是这样一个问题。
这个问题不止困扰很多初学者,有的2年工作经验都不太理解,接口到底是个什么东西。
这里根据本人对接口的理解,简单谈谈如何理解接口,如有错误,请指正。
接口是什么
接口首先是个规范(也可以叫协议,觉得怎么理解方便怎么理解就好)
先举个生活中的例子
某天你去上海去旅游,做了半天的车,下车后有点饿,想吃点东西,找了一个上海菜的饭店。进去准备吃东西。
这里的菜单就是一个特别形象的接口。
看菜单我就知道这家店卖红烧肉,生煎包, 手撕鸡, 清蒸大闸蟹、蟹粉小笼、蟹粉豆腐,八宝鸭等等菜品。然后我就可以直接点点餐, 来个红烧肉,生煎包,来个XX汤。搞定。
楼主是东北人,如果没有菜单,我进去可能会问有没有小鸡炖蘑菇、猪肉炖粉条。然后告诉我都没有。这样一个一个的问非常麻烦,而且还未必知道点什么。那我就要问你这都有什么啊,服务员跟我balabala一堆,我还没记住都有什么,这点餐是不是特别麻烦呢,有了菜单简单多了。这里的菜单就可以理解为一个接口。顾客就是接口的调用者,厨房就是接口的实现类,会根据接口提供的方法,提供各种菜品。
上面的例子代表了接口一个重要作用,接口首先是个规范。这个规范很方便调用者去使用。就是上面的顾客,顾客不需要知道你是怎么做的红烧肉,只需要知道你有红烧肉就够了。这个情况下就非常适合使用接口了。
总结:接口是为2个不同类之间连接定义的标准。上面的顾客和厨房,直接用菜单连接起来。
职责的分离
还是拿生活中最常见的东西举例子。

插排, 应该是家里都有的东西了,插排的插孔一般有2个的也有三个的。现在很多插排还提供了USB口。这里我们可以把2口的插孔,三口的插孔。还有USB口的插孔理解位三个不同的接口。个接口定义了插排孔的大小,和距离。有这样的接口,我才能通过接口或者说是规范去生产插排,然后才能提供给你使用。如果我提供的接口比较小你手机的充电头插不进去,那么我生产了是不是没有意义呢。我生产的插排是为了给用户使用的,而使用插排的就是插排的调用者,就是一个个具体的插头,如果用户的插头是USB的那普通的插排就无法使用。这时候用户就需要找到一个实现了USB接口的插排。而用户却不用关心你是如何实现的,也不需要考虑你生产的是什么样子,只要你按接口实现就可以了。上图给了不同类型的插排,虽然样子各异,功能也不完全一样,但是他们都实现了具体的接口。
通过上面的例子,我们定义了三个不同的接口,每个接口有不同的具体实现。但是具体实现是谁作为调用者完全不关系,是公牛插排也好,小米插排也好,或者是飞利浦也无所谓。这就出现了接口的一个重要思想,接口和实现分离的思想。这个思想的一个最直接的好处就是,代码的解耦。插头的制造过程不考虑插排的具体实现,而只是按照标准接口实现就可以。而插排的制造也不需要具体的插头。根本不需要考虑是谁去使用,不管是手机用电脑用,电视用或者别的东西。我只要按标准生产我的就行了。这样分工就非常明确了。减少了耦合度。使插排的制造和插头的制造都变得更加容易。而且更加的具有适应性。
结尾
本来还有一些东西需要写一下。暂时先总结一下,以后补充上。
第一接口可以理解位一个规范。这个规范规定了一个类的部分行为,而不是全部行为。
比如上面的例子我们有三个接口。有的插排只实现了其中的两个,而没有USB接口。那么不需要USB接口的调用者,比如电视机就可以使用这个插排。
接口可以隔离实现,对于接口的调用者,不需要考虑他调用哪个具体实现类,如果没有接口,那么电视可能就是位固定的插排生产的,这样做一般也没什么,只要插排没有问题,电视还是可以用的,但是有一天插排出了问题,你需要换个插排的时候。因为没有固定的接口,那么其他人生产的插排可能完全用不了。
如果两个类都是按同一个标准实现了一个同名的方法,那么是不是也可以呢,理论个别情况可以,但是这里就出现另一个问题,就是如果他们只是方法名相同,但是没有实现同一个接口,那么对于调用者来说,他需要非常明白两个类的这个方法都是具体做什么才可以这样用,如果使用接口,调用者就不需要考虑这个问题,而直接调用接口的这个方法就行了。
还有一个重点要说的地方。就是接口有一个好处就是实现了,接口和实现的分离,如果不理解这句话,用另外一个意思理解,定义和实现相分离,接口只是对某一类东西的定义,而具体实现就是具体的类,分离有一个好处就是,可以更好的隐藏实现。很多时候实现是不希望被调用者看到具体的实现细节的。而只是位调用者提供几个方法,这个时候接口就特别有用了。
比如上面吃饭的例子,用户只是看了菜单而已,但是具体如何做的菜,用户是不知道的。饭店也不提供厨房给用户参观,对用户来说,厨房用了什么东西根本不知道,而饭店很多时候希望这样的结果,比如豆油,有各种价格的,可以用低价的提供。米饭也一样。虽然这不是个好想法。
关于我
我是IsCoding,7年Android从业经验。
QQ群号 121915371
QQ 号 1400100300
网友评论