风趣探讨:为什么需要一个接口,一个接口的实现类,而不是直接调用类里的方法

之所以叫风趣探讨,我觉得这个话题非常有意思,也非常重要。

知乎上有个老哥说:能问这个问题,说明(1)你很会思考(2)编程水平还是处于起步阶段。(https://www.zhihu.com/question/20111251)

我觉得他说的很有道理。那么,这个问题,我们弄懂了,透彻了,并且身体力行了,我们的面向接口思想或许就能提升。


这样写的第一个作用:

“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?

可能有些同学还不知道我们探讨的具体是什么问题。这里给出例子

public abstract class Context {
public final class ContextImpl extends Context {

就如上面的文字部分所说,你怎么就保证了只有一个类会去实现这个接口呢?事实上,Context类的结构是这样的:

风趣探讨:为什么需要一个接口,一个接口的实现类,而不是直接调用类里的方法(图片来自郭霖博客)


但是,有的时候,我参看源码,又会发现,很多时候,一个接口只有一个实现类,他还是要这么做,这样是不是真的就多此一举了呢?

很抱歉,依然不是多此一举。在这里的作用是——项目协作,是项目模块化的利器。当你决定把一个类,仅仅给自己用,而且不打算再度扩展,那么这个时候,你可以选择不用接口+接口impl的形式。但是一旦你是进行一个团队合作的话,你就必须这么做。这个时候,接口就成为了一个约定,你的团队成员就无需在意你的代码细节,只需要关注于你的功能即可。说到这里,你是否可以想到,后台给你的东西,也叫接口?你再好好想想何为接口?难道后台返回给你所有的代码才是最合适的吗?我来替你总结一下,接口的作用之一:别人替你做了一些事,只给你你个调用口,你就可以成功地使用这个调用口,去得到他在背后默默地替你做的所有的操作所返回的结果。这,就是接口。


再说项目模块化。啥是项目模块化?我的师傅这样问我。我装B的回答:

“不太懂 我目前的认知是 组件化像sdk一样
只和调用者耦合“
师傅又问,带着怒意:

“ 模块化 懂 吗?”

我:“不懂”

师傅:“

 组件化 先别 去理解 了 那个东西 没有固定的 概念
都是按个人理解
模块 化 就好开解了 
好理解了
用户中心 模块
商城 模块
o2
o2o模块
 聊天模块
网络请求可以 是模块 也可以叫组件
类似这样
每个模块 做每个模块固定的功能 
理解了?

这回我懂了,什么聊天模块,商城模块就是模块。

这个时候你可能感觉到接口的必要性了吧! 那么我的商城模块这么多类,又互不统一,怎么才能优雅的以接口的形式暴露出来呢?

你可以弄一个托管类接口,再弄一个托管类impl,在托管类impl中进行一个调用即可。


总结一下:

1.用接口形成多实现体系,如集合框架

2.项目协作, 最小代价、最优雅地暴露功能给队友

3.模块化


最后 看了一点effective java 又领悟到了模块之间解耦的作用

这个不是我随便乱说的 我能讲通道理

interface和interfaceImpl还有调用者。本来是调用者和类直接耦合了,现在是interface和interfaceImpl建立联系,interface和调用者建立联系,我们旨在减少调用者和类的直接联系,这叫封装,也叫信息隐藏。