到底面向?编程

面向过程编程( ProcedureOriented、简称 PO)面向对象编程( ObjectOriented、简称 OO) 我们一定听过,然而实际企业级开发里受用更多的一种编程思想那就是:面向接口编程( Interface-Oriented)

接口这个概念我们一定不陌生,实际生活中最常见的例子就是:插座!

我们只需要事先定义好插座的接口标准,各大插座厂商只要按这个接口标准生产,管你什么牌子、内部什么电路结构,这些均和用户无关,用户拿来就可以用;而且即使插座坏了,只要换一个符合接口标准的新插座,一切照样工作!

同理,实际代码设计也是这样!

我们在设计一个软件的代码架构时,我们都希望事先约定好各个功能的接口(即:约定好接口签名和方法),实际开发时我们只需要实现这个接口就能完成具体的功能!后续即使项目变化、功能升级,程序员只需要按照接口约定重新实现一下,就可以达到系统升级和扩展的目的!

正好,Java中天生就有 interface这个语法,这简直是为面向接口编程而生的!

所以接下来落实到代码上,举个通俗一点的小例子唠一唠,实际业务代码虽然比这个复杂,但原理是一模一样的。


做梦了

假如哪一天程序羊真发达了,一口豪气买了两辆豪车,一辆五菱宏光、一辆飞度、并且还专门聘请了一位驾驶员来帮助驾驶。

两辆豪车在此:

驾驶员定义在此:

驾驶员定义了两个 drive()方法,分别用来驾驶两辆车:

这暂且看起来没问题!日子过得很融洽。

但后来过了段时间,程序羊又变得发达了一点,这次他又豪气地买了一辆新款奥拓(Alto)!

可是现有的驾驶员类 Driver的两个 drive()方法里都开不了这辆新买的奥拓该怎么办呢?


代码的灵活解耦

这时候,我想应该没有谁会专门再去往 Driver类中添加一个新的 drive()方法来达到目的吧?毕竟谁也不知道以后他还会不会买新车!

这时候如果我希望我聘请的这位驾驶员对于所有车型都能驾驭,该怎么办呢?

很容易想到,我们应该做一层抽象。毕竟不管是奥拓还是奥迪,它们都是汽车,因此我们定义一个父类叫做汽车类 Car,里面只声明一个通用的 drive()方法,具体怎么开先不用管:

这时,只要我新买的奥拓符合 Car定义的驾驶标准即可被我的驾驶员驾驶,所以只需要新的奥拓来继承一下 Car类即可:

同理,只需要我的驾驶员具备通用汽车 Car的驾驶能力,那驾驶所有的汽车都不是问题,因此 Drvier类的 drive()方法只要传入的参数是父类,那就具备了通用性:

问题暂且解决了!


但是再后来,程序羊他好像又更发达了一些,连车都不想坐了,想买一头驴(Donkey)让司机骑着带他出行!

很明显,原先适用于汽车的 drive()方法肯定是不适合骑驴的!但我们希望聘请的这位驾驶员既会开汽车,又会骑驴怎么办呢?

害!我们干脆直接定义一个叫做交通工具( TrafficTools)的通用接口吧!里面包含一个通用的交通工具使用方法,管你是驾驶汽车,还是骑驴骑马,具体技能怎么实现先不管:

有了这个接口约定,接下来就好办了。我们让所有的 Car、或者驴、马等,都来实现这个接口:

这个时候只要我们的驾驶员师傅也面向接口编程,就没有任何问题:

很明显,代码完全解耦了!这就是接口带来的便利。


代码的扩展性

面向接口编程的优点远不止上面这种代码解耦的场景,在实际企业开发里,利用接口思想对已有代码进行灵活扩展也特别常见。

再举一个例子:假设程序羊有一个非常豪气的朋友,叫:程序牛,他们家出行可不坐车,全靠私人飞机出行:

但是突然有一天,他们家聘请的机长跳槽了,这时候程序牛一家就无法出行了,毕竟飞机不会驾驶。

于是他跑来问我借司机,想让我的驾驶员来帮他驾驶飞机出去旅行。

我一看,由于他们的代码面向的是接口,我就肯定地答应了他!

这时候对我这边的扩展来说就非常容易了,我只需要安排我的驾驶员去培训一下飞行技能就OK了(实现一个方法就行):

这时候我的驾驶员 Driver类就可以直接服务于他们一家的出行了:

看到没,这一改造过程中,我们只增加了代码,却并没有修改任何已有代码,就完成了代码扩展的任务,非常符合开闭原则


实际项目

实际开发中,我们就暂且不说诸如 Spring这种框架内部会大量使用接口,并对外提供使用,就连我们自己平时写业务代码,我们也习惯于在 Service层使用接口来进行一层隔离:

这种接口定义和具体实现逻辑的分开,非常有利于后续扩展和维护!


小结

面向接口编程开发,对代码架构的解耦和扩展确实很有好处,这种编码思想也值得平时开发结合实践反复理解和回味!


每天进步一点点,Peace!

2020.03.04 晚

面向接口编程的优点_为什么我们要面向接口编程相关推荐

  1. python面向接口编程_Python 中的面向接口编程

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...

  2. 树莓派python编程优点_树莓派为什么会使用python编程?为什么有时python运行效率不高?...

    在许多编程语言中,Python的语法也有很大不同.Python使用空格或缩进来分隔不同的代码块.C语言和其他语言使用花括号来区分不同的代码块,例如if语句,Python使用冒号和缩进来定义代码块.这也 ...

  3. java 用面向接口编程的方式开发打印机_Java“打印机”模型理解面向接口编程。实现接口定义类,接口实现类,核心“业务”类分离...

    接口定义类 IinkBox.java package printerDemo.iface; public interface IInkBox { public String getColor(); } ...

  4. python aop编程_学习笔记: AOP面向切面编程和C#多种实现

    AOP:面向切面编程   编程思想 OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统 类--砖头     系统--房子 类--细胞     系统--人 面向对象是非常适合做大型 ...

  5. arduino nano 蓝牙_掌控板IO接口编程入门 | 用Arduino玩转掌控板(ESP32)系列

    众所周知,掌控板在创客教育中用的非常广泛,它是一块基于 ESP32 的学习开发板.大家对掌控板编程,用的比较多的都是图形化编程的方式,比如 mPython.Mind+ 等.但是,既然掌控板是基于 ES ...

  6. 设计模式(二)—— 策略模式(其实就是面向接口编程的应用场景!)

    目录 策略模式总结 问题描述 版本(一) 版本(二) 版本(三) 新场景 无论是7个设计原则还是设计模式,完全遵循是很难的,但应有意识尽量遵循. "以往是代码复用,设计模式是经验复用&quo ...

  7. 问题小结(二)——maven的核心功能、面向对象编程和面向接口编程的区别、抽象类和接口的区别等

    文章目录 1. Java创建对象有哪四种方式? 2. 什么是maven?maven的核心功能有哪些? 3. 什么是MVC?说说分层的好处. 4. Spring的两大核心技术是什么? 5. 什么是IOC ...

  8. 什么是面向接口编程、面向过程编程、面向对象编程?

    1.什么是面向接口编程?(IOP) 面向接口编程(Interface Oriented Programming:IOP)是一种编程思想,接口作为实体抽象出来的一种表现形式,用于抽离内部实现进行外部沟通 ...

  9. 面向接口编程的好处分析

    洞悉编程思想是我们学习语言过程中的必由之路,但注意对于编程思想的理解一定要建立在大量的代码实现经验上,不然只是在口头空谈编程思想而不去编程,根本无法深入理解思想的核心. 面向对象思想的核心之一,就是模 ...

最新文章

  1. 内卷时代,互联网人相亲有多难?|漫画
  2. docker从私有仓库Harbor, push 及 pull 镜像
  3. golang 切片copy复制 和 等号复制 区别
  4. BGP边界网关协议线路优势
  5. html转word 图片丢失 java_Java 设置 Word 文档中图片文字环绕方式
  6. 计算机属性桌面打不开怎么办,win10电脑桌面图标属性打不开如何解决_win10无法打开桌面图标属性面板解决步骤...
  7. java servlet 开发_Java之基于Servlet的Web开发简介
  8. 全网首次公开!iOS14 到来前,开发者必需的时间表及 To do list
  9. ubuntu 16.04 登录后黑屏
  10. git-bisect last updated in 2.19.1【转】
  11. js删除字符串的最后一个字符几种方法
  12. socket编程:SO_REUSEADDR例解
  13. C++单例模式--线程安全
  14. Rational Rose2003安装
  15. 2020年的19种最佳React Native App模板(包括5种免费)
  16. PS2018 cc的下载和安装
  17. 先吃奶油还是先吃蛋糕--推迟满足感
  18. python mpi4py multiprocessing_python基于multiprocessing的多进程创建方法
  19. no suitable conversion function from “std::reverse_iterator<double *>“ to “double *“ exists
  20. 占豪--2010年的市场机会在哪里(兼谈股指期货与楼市)

热门文章

  1. 企业网站前端制作实战教程 JQuery CSS JS HTML 登录表单验证
  2. 前端学习(1036):bootstrap-js插件2
  3. 前端学习(529):等分布局存在间距得实现得解决方案
  4. 第六十六期:运维专家写给运维工程师的6条人生忠告
  5. 第二十五期:搞定Linux Shell文本处理工具,看完这篇集锦就够了
  6. stylus之内置方法(Built-in Functions)
  7. 函数模板(参考《C++ Templates 英文版第二版》)
  8. python算法与程序设计基础(第二版)第八章实训答案_Python算法与程序设计基础(第2版)...
  9. WIN10远程连接时提示内部错误
  10. 索引原理及几种索引类型区别