面试官的窒息逼问: 到底什么是面向接口编程?

面试官的窒息逼问: 到底什么是面向接口编程?最近有小伙伴在面试的时候被问到一个比较少见的问题 什么是面向接口编程 特此记录


  • ? 个人主页: IT学习日记
  • ? 版权: 本文由【IT学习日记】原创、在CSDN首发
  • ? 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)
  • ? 有任何问题欢迎私信,看到会及时回复!

一、前言

? 一、前言

  • 大家好,我是小诚,又到了愉快的学习时间,最近收到小伙伴投稿,在面试的时候被面试官询问到一个比较少见的问题: 什么是面向接口编程? 说实话,之前我也面试过很多公司,也没有遇到过这个问题,感觉挺新颖的,故特以此文记录学习,因为本人水平有限,看待问题的时候可能不够全面,如有不同看法,欢迎大家在下方留言讨论。
  • 如果文章对你有帮助,可以帮忙一键三连哦! 如面试中遇到一些奇怪或者比较新颖的题目,欢迎私信投稿,感谢阅读!

在这里插入图片描述

二、面试官这样询问的用意


? 二、面试官这样询问的用意

三、什么是接口


? 三、什么是接口

四、面向过程编程、面向对象编程、面向接口编程对比


? 四、面向过程编程、面向对象编程、面向接口编程对比

  在编码过程中,会听到关于这三者的介绍,有时候虽然对它们的概念有大致的了解,但是让你表达出来的时候总感觉表达不明白,下面通过具体的例子更加形象直观对它们重新的认识吧。

? 4.1、面向过程编程(POP)

  面向过程编程(Procedure Oriented Programming 简称POP :如C语言),着重的是过程,解决一个问题的时候,先分析出解决这个问题需要的步骤,然后使用函数将这些步骤一步步实现,然后处理问题的时候按照一定的顺序将这个函数一个个调用,方法执行完后问题也解决了。

  举例说明:肚子痛、怎么解决?(这是一个有味道的例子,但是为了让大家理解,所以举例得更去贴近生活些,如果觉的味道太大,下方留言,下次换个好例子)

  如果使用面向过程编程方式解决这个问题,那么流程大概如下:

  1、执行查找纸巾方法(不找纸巾难道用手?)

  2、执行坐上马桶方法(没有马桶你不会站着?)

  3、执行清理人体食物残渣排泄物方法(哎,舒服!)

  4、执行清洁方法(不清洁,难道上完号就提起裤子就走?)

  5、执行冲马桶方法(不冲!臭的可是你自己!)

在这里插入图片描述















  面向过程编程小结:

  通过上面的例子会发现,面向过程编程的思想在解决问题时,是将问题拆分成一个个步骤,每个步骤封装成对应的函数,然后按照某个顺序去执行,从而解决问题。

? 4.2、面向对象编程(OOP)

  面向对象编程(Object Oriented Programming 简称OOP :如C++,JAVA等语言),侧重点在对象,解决一个问题时,先将问题中的包含的事物抽象成对象概念,对象中包含具体的属性和行为,真正执行时再让每个对象去执行自己的某些方法,从而解决问题。

  举例说明:肚子痛、怎么解决?

  使用面向对象编程方式解决这个问题的大概流程如下:

  1、根据问题涉及到的实体,抽象出“人”对象、”马桶“对象、”纸巾“对象

  2、针对“人”对象添加一些属性和方法,属性如:xx 28cm、黑长直。方法:寻找纸巾方法、坐上马桶方法、清除排泄物方法、清洁xx工具方法

  3、针对“马桶”对象添加一些属性和方法,属性如:白色、长15m、椭圆形。方法:冲马桶方法

  4、针对“纸巾”对象添加一些属性和方法,属性如:白/黑/金色

  5、执行:

    人对象.寻找纸巾方法

    人对象.坐上马桶方法

    人对象.清除排泄物方法

    马桶.冲马桶方法(是的,马桶是自感应的,有钱你也可以这样玩,有钱人的生活就是舒服)

    人对象.清洁xx工具方法(清洁哪里不用我说你也懂吧!DDDD)
请添加图片描述



























  面向对象编程小结:

  通过例子可以发现,解决相同的问题,面向对象编程的方式是先将问题中的实体抽象成具体的对象,然后再将属性和方法封装到对象中,最后通过不同的对象执行相应的方法解决问题。

? 4.3、面向接口编码(IOP)

  面向接口编程(Interface Oriented Programming:OIP)是一种编程思想,接口作为实体抽象出来的一种表现形式,用于抽离内部实现进行外部沟通,最终实现内部变动而不影响外部与其他实现交互,可以理解成按照这种思想来设计编程的方式就可以称为面向接口编程。

  它并不是比面向对象编程更先进的一种独立的编程思想,可以说属于面向对象思想体系的一部分或者说它是面向对象编程体系中的思想精髓之一。

请添加图片描述






  注: 上图中红框标出来的地方就是区别于面向对象编程的一些特点。

  上面面向过程和面向对象都举例肚子痛问题解决的例子,结合我们平常生活中经验可以知道,无论男女、都可能出现肚子痛需要上厕所的问题,但是不同的人有不同的方式解决这个问题,不可能每有一个不同处理方式的人就修改一次原来代码,这样不仅不符合面向对象编程中的开闭原则【对拓展开放,对修改关闭】,还可能带来潜在的风险。

  因此、我们可以将上面面向对象编程中上厕所的五个步骤抽取到【人肚子痛处理接口]和】【马桶接口】,哪个人肚子痛就实现这个【人肚子痛处理接口】,每个马桶类型都实现【马桶接口】(因为不是每个马桶的清理细节都一样,有的是自动,有的是手动)。

  具体怎么上厕所、冲马桶由你自己定义,你可以站着上、坐着上、倒立上都可以,这样就达到了内部变动而不影响外部交互的目的,我使用这个接口类型接收实现了这个接口的实现者,实现者中的方法逻辑修改了,并不影响我接收它,进行方法调用。





五、面向过程编程特点


? 五、面向过程编程特点

  优点:

  将问题拆解成一个个步骤、类似流水线一样,一步步执行,将复杂的问题流程化进而简单化。

  性能比面向对象编程高,面向对象编程中类调用过程需要加载、实例化,资源消耗更大;对向性能要求高的比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发。

  缺点:

  没有面向对象编程易维护、易复用、易扩展

  使用场景:

  适用于性能要求较高的系统开发中











六、面向对象编程特点


? 六、面向对象编程特点

  优点:

  易理解:采用面向对象思想设计开发,更符合人的思考方式,可读性高。

  易维护:面向对象有封装、继承、多态性的特性,即使需求有变动,需要维护的更多是局部模块,维护起来更加方便和更低成本。

  易扩展:面向对象有封装、继承、多态性的特性,在设计系统阶段可以设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展。

  易复用:也是同理,因为面向对象的三大特性,使得通用代码可以更简单的复用,提高开发效率。

  缺点:

  性能会比面向过程低,编程复杂度较高

  使用场景:

  用户需求经常变化,互联网应用,游戏,企业内部应用
















七、面向接口编程的作用


? 七、面向接口编程的作用

? 7.1、符合开闭、依赖倒置原则、增强拓展性

  开闭原则OCP(Open-Close Principle): 对拓展开放、对修改关闭。

  依赖倒置原则DIP(Dependency Inversion Principle): 抽象不应该依赖于细节、细节应该依赖于抽象

  在软件开发中,因为业务的不断变化,系统拓展性是时刻存在的。以数据库为例,在没有引入接口之前,项目一开始因为业务量较小的原因,设计的时候我们会是直接通过代码来实现对某一数据库的一系列操作,抽象出来就如下图显示:

请添加图片描述








请添加图片描述


  很明显,因为我们一开始业务简单就只考虑了一种数据库,导致操作数据库的代码强依赖了具体的实现类,如今因为业务变化需要引入了其他不同的数据库,为了达到这个目的,我们不得已要去修改原来业务的代码,这样的修改显然是违背了面向对象编程的开闭原则、依赖倒置原则和带来了潜在的风险,因此,这样的设计并不合理,故我们引入了接口,抽象出来如下:

请添加图片描述


  如上图所示,有了接口这一标准,我们的JAVA程序无需直接依赖对应的实现类,每种数据库厂商实现JDBC标准,给使用者提供一个驱动,如果我们因为业务变动需要引入第三方数据库,只需要修改对应的驱动即可,不需要变动原来的逻辑,不仅满足了业务代码不再依赖实现类,而是实现类依赖接口即依赖倒置原则「抽象不应该依赖于细节,细节应该依赖于抽象」和开闭原则[对拓展开放,对修改关闭],还避免了改动带来的潜在风险。

  接口中定义了规范、不同的实现者去根据自己需求实现规范,后面如果有新的需求,可以创建新的实现者实现接口规范即可,这样做到了代码的松耦合。

  最常见的例子就是: JDBC(JAVA数据库连接),它是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,是Java访问数据库的标准规范。

  无规则聚不成方圆,如果没有JDBC的话访问的数据库操作就没有了规范,所有的数据库厂商都会有自己的一套数据库的访问规则,一旦公司的数据库从切换数据库,整个涉及到数据库的代码都需要重新写、这对开发者来说简直是世界末日。

  所以sun公司统一了数据库的规范,不同的数据库厂商需要提供实现了这个规范的一个驱动,用于开发者连接数据库时进行通信,有了JDBC,开发者不需要关注如何去编写针对不同数据库的访问代码,变动数据库时,只需要去切换不同的驱动即可。

  PS:JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库! 每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。









八:、抽象类和接口的关系


? 八、抽象类和接口的关系

九、标记接口


? 九、标记接口

  特点:

  标记接口(Market Interface),也叫标签接口(Tag Interface),它表示的是没有任何方法和属性的接口,它仅仅表明被标记的类属于一个特定的类型,供其他代码来测试允许做一些事情。


The tag/marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata.

  上面的英文是维基百科关于标记接口的一个描述,由此,我们可以知道,标记接口并不是JAVA语言独有的东西,而是计算机科学中的一种设计理念,用于给面向对象语言描述对象。

  因为编程语言本身并不支持为类维护元数据,而标记接口可以用作描述类的元数据,弥补了这个功能上的缺失。对于实现了标记接口的类,我们就可以在运行时通过反射机制去获取元数据。

  在JDK中,我们最常接触到的标记接口有许多如: Serializable、Cloneable、RandomAccess等,如果一个类实现了Serializable接口,表示这个类是可以被序列化的,实际上的原理就是实现了这个接口的类就会被打上一个【可序列化】的标签,在运行时可以通过反射去获取然后进行一系列的操作。



  在JAVA中,标记接口的作用主要在以下两方面:

  1、建立一个公共的父接口:

  正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

   2、向一个类添加数据类型

  这个是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型即可以使用这个接口去接收实现了它的具体类的实例。







十、关于面向接口编程在实际运用的一些问题


? 十、关于面向接口编程在实际运用的一些问题

10.1、为什么现在很多项目从controller、service到dao层都是使用: 接口 + 实现类的方式、但是只有一个实现类,这种方式是否有必要?

十一、写在最后


? 十一、写在最后

  好了,关于面向接口编程的介绍今天介绍到这里,大家有不同看法的欢迎在下方留言,欢迎大家向我投稿面试中遇到的奇葩问题噢,学习了就要运行,赶紧拿着文章找个面试官对线一波吧。如果文章对你有帮助,不要忘记三连呀!

  顺便预告下篇文章的内容,不知不觉写博客已经两年了,粉丝虽然不多,但是也准备到了6千,所以准备给大家反馈下福利(主要是关于写博客的素材和面试真题的),感兴趣的可以留意下,最近因为工作原因和自我质量要求原因,博客的更新频率会大概保持在每周一更左右,希望能够给大家带来更有质量的文章!

十二、参考资料


? 十二、参考资料
































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200463.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:47
下一篇 2026年3月20日 上午10:47


相关推荐

  • 【算法题】单例模式的8种实现方式(java版)「建议收藏」

    【算法题】单例模式的8种实现方式(java版)「建议收藏」根据马士兵老师的视频整理下来的8种单例模式的实现方式,在此记录一下。代码示例1:饿汉式packagecom.examples.singleton;publicclassMgr01{publicstaticvoidmain(String[]args){Mgr01m1=Mgr01.getInstance();Mgr01m2=Mgr01.getInstance();System.out.println(m1…

    2022年7月8日
    23
  • Pycharm安装第三方库的简易方法

    Pycharm安装第三方库的简易方法使用 python 时 为了提高效率 安装添加第三方库是必不可少的 这里介绍一个简易的采用 pycharm 安装第三方库的方法 1 打开 pycharm 先点击 File 弹出的菜单中再点击 settings mac 快捷键 command windows 快捷键 ctrl alt s2 点击 settings 之后再点击 project 下面的 projectInter 在出现的界面中 点击上面界面右上角的 如下图所示 3 在出现的界面中搜索需要安装的第三方库 比如 pymysql 然后点击界面左下角

    2026年3月27日
    2
  • Linux上nginx配置SSL协议非80、443端口自动跳往https端口

    Linux上nginx配置SSL协议非80、443端口自动跳往https端口在生产环境中往往碰到一个网站需要多个访问端口,而默认的http访问端口是80,https访问的端口是443,然而这是不够在生产环境下使用的,这个时候就需要配置更多的端口来弥补这一缺点。默认情况下用户输入URL时是约简单越好,比如http://baidu.com,用户只需要输入baidu.com就可以访问。但是这样是通过http协议进行访问,而并非https进行访问。站在用户的角度来考虑问题他不…

    2022年6月22日
    121
  • 三极管原理-导通条件

    三极管原理-导通条件简单理解 三极管是电子行业常用的元器件之一 他是一种电流型控制的器件 他有三种工作状态 截止区 放大区 饱和区 当三极管当做开关使用时 他工作在饱和区 下面简短讲解三极管作为开关使用的方法 只讲干货 对三极管放大作用的理解 切记一点 能量不会无缘无故的产生 所以 三极管一定不会产生能量 但三极管厉害的地方在于 它可以通过小电流控制大电流 放大的原理就在于 通过小的交流输入 控

    2026年3月26日
    2
  • 通过经纬度计算距离的公式是什么_excel经纬度计算距离公式

    通过经纬度计算距离的公式是什么_excel经纬度计算距离公式原文地址:http://www.storyday.com/html/y2009/2212_according-to-latitude-and-longitude-distance-calculation-formula.html在去年cosbeta曾经发布了一个网页计算工具,这个作用就是根据地球上两点之间的经纬度计算两点之间的直线距离。经纬度到距离的计算在通信工程中应用比较广泛,所以cosbet

    2026年2月20日
    4
  • linux卸载nps,Linux NPS服务部署

    linux卸载nps,Linux NPS服务部署一.安装NFS服务rpm-qa|grepnfsrpm-qa|greprpcbindyuminstallnfs-utils#如果检查的结果是没有安装,则使用该命令安装/etc/init.d/rpcbindstart/etc/init.d/nfsstart二.NFS的软件结构1.主要配置文件:/etc/exports这个档案就是NFS的主要配置文件了!…

    2022年5月2日
    219

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号