在以往的编程学习中,我们听说过很多编程概念,比如面向对象编程(OOP)、面向方面编程(AOP)、面向过程编程(POP),以及还有今天要进行深入思考的面向接口编程(IOP)。计算机的发展已经足足七十多年,编程语言的发展也有了六七十年的历史,而近二三十年随着互联网和高级编程语言的不断崛起,整个程序设计行业发展的越来越快,沉淀的也越来越多,因而诞生了诸如以上的很多不同的编程思想。

首先,第一个问题。

1 什么是接口?

接口一词听起来更像是一个物理学电学上的东西,比如USB接口、Type-C接口等等,当然在计算机科学中也十分的常见,主要分为硬件和软件两个层面:

  • 硬件层的接口:两个硬件设备之间的连接方式和媒介
  • 软件层的接口:软件设计和应用服务不同功能层之间的通信规则

当然,在编程语言中接口还可以再细化,比如在Java语言中,接口是一个抽象的类,而在Go语言中,接口则是一种类型。

接下来,第二个问题。

2 什么是面向接口编程?

什么是面向接口编程?为什么要面向接口编程?

简单的讲,面向接口编程是一种编程规范,一种设计规范,可以更好的进行需求的定义和业务的扩展,我们可以从以下三个方面来探讨为什么要面向接口编程:

  • 开闭原则:对扩展开放,对修改关闭,接口正是如此,定义接口后不再修改,只扩展其对应的实现。
  • 依赖倒置原则:高层模块不应该依赖于低层模块,他们应该共同依赖于抽象,而这个抽象就是接口。
  • 增加抽象层、解耦:接口显然是对抽象的一个封装,能够达到解耦的目的。

2.1 业务需求分析

假设我们有一个产品经理想要与开发工程师对接需求,有的需求在数据库层面,属于数据需求,有的在业务层面,属于功能需求,这样就导致了在产品经理和工程师沟通时存在一些复杂的程度,比如产品经理要先了解每个工程师都对应的哪方面的业务需求,再与其进行需求的对接等等。

上述情况,如果是工程师数量少的话影响并不大,但是当工程师多了以后问题就会非常繁琐,因此我们需要定义一个规范,由工程师统一的回答,可以理解成为问题的提问与解释的模板,当换了工程师或换了业务之后,接口并没有换,实现依然可以扩展,这就是面向接口编程的魅力!

对于以上的需求分析,我们作出一个代码实例,因为Java、Go都是可以面向接口编程,因此我们对两个语言的面向接口编程都作出简单的示例:

  • 定义接口为工程师抽象,分别有coding和play抽象方法
  • 针对该抽象作出两个实现,分别是DB工程师和Sys(系统)工程师
  • main函数和test可以想象为产品经理对接口的实现进行查验

2.2 Java面向接口编程实现

@Test
void test() {Programmer programmer = new DBProgrammer("zs");programmer.coding("SQL");
}//接口 -> 规范
interface Programmer {void coding(String code);void play(String ball);
}//DB程序员
class DBProgrammer implements Programmer {private String name;public DBProgrammer(String name) {this.name = name;}@Overridepublic void coding(String code) {System.out.println("I am DB Programmer " + this.name + " and coding " + code + ".");}@Overridepublic void play(String ball) {System.out.println("I am DB Programmer " + this.name + " and playing " + ball + ".");}
}//系统程序员
class SysProgrammer implements Programmer {private String name;public SysProgrammer(String name) {this.name = name;}@Overridepublic void coding(String code) {System.out.println("I am Sys Programmer " + this.name + " and coding " + code + ".");}@Overridepublic void play(String ball) {System.out.println("I am Sys Programmer " + this.name + " and playing " + ball + ".");}
}

2.3 Go面向接口编程实现

接口

type Programmer interface {Coding(code string)Play(ball string)
}

ProgrammerDB实现

type ProgrammerDB struct {Name   stringAge    intDBName string
}func (db ProgrammerDB) Coding(code string) {fmt.Println("I am DB Programmer", db.Name, "and I am coding", code, ".")
}func (db ProgrammerDB) Play(ball string) {fmt.Println("I am DB Programmer", db.Name, "and I am playing", ball, ".")
}

ProgrammerSys实现

type ProgrammerSys struct {Name    stringAge     intSysName string
}func (sys ProgrammerSys) Coding(code string) {fmt.Println("I am Sys Programmer", sys.Name, "and I am coding", code, ".")
}func (sys ProgrammerSys) Play(ball string) {fmt.Println("I am Sys Programmer ", sys.Name, " and I am playing ", ball, ".")
}

测试

func main() {sys := ProgrammerSys{Name: "zs"}sys.Coding("Java")db := ProgrammerDB{Name: "ls"}db.Coding("SQL")
}

3 思考

到这里,讲了这么多,其实最终的总结很简单:接口的本质就是抽象和规范,接口是抽象的产物,应用于规范

使用接口可以更好的将我们的系统进行解耦,不管是多系统之间(如RPC框架),还是同一系统多模块之间,接口所扮演的抽象的角色都是不可替代的。

今天的分享就到这里,如有哪里理解的不够深入,请读者朋友不吝赐教哈~

深度思考:到底什么是面向接口编程?相关推荐

  1. go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?

    到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...

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

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

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

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

  4. 软件设计模式—面向接口编程

    原文作者:laoer2009 原文地址:设计模式之面向接口编程 01第一次需求 玩家有很多属性,例如:身高,性别 blalalala ,玩家可以攻击其他玩家.产品狗YY妹子写程序也是很利索,一天就把程 ...

  5. Java中的面向接口编程

    面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...

  6. 面向接口编程的优点_为什么我们要面向接口编程

    到底面向?编程 面向过程编程( ProcedureOriented.简称 PO) 和 面向对象编程( ObjectOriented.简称 OO) 我们一定听过,然而实际企业级开发里受用更多的一种编程思 ...

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

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

  8. 面向“接口”编程和面向“实现”编程

    英文原文:Program to an Interface, Fool 如果你已经读了我的前几篇关于面向对象范式因为受到 Rust, Go 等语言的影响而发生变化的文章,看到了我正在研究的 Rust 设 ...

  9. 从面向对象编程转为面向接口编程

    大家写过C++或者Java,或者其他语言,基本上都会接触到面向对象这个概念. 面向对象,本身是软件编程发展过程中的产物,当然相比于面向过程,是一种突破性的设计.但是,如果只是停留在面向对象编程,而不是 ...

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

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

最新文章

  1. eclipse运行maven web项目
  2. 一名合格的运维工程师的历练之路
  3. ext 动态赋值text_JQuery中html,val,text-取值赋值的区别-
  4. 有赞订单管理的三生三世与“十面埋伏”
  5. java多线程绘图_菜鸟学Java之 Java2D 多线程绘图
  6. 2021亚太内容分发大会 阿里云荣获三项大奖
  7. python类和实例化
  8. 【周末狂欢赛7】【NOIP模拟赛】七夕祭,齿轮(dfs),天才黑客
  9. 都说不建议使用递归操作,到底为什么?
  10. python 图书馆管理程序下载_图书管理系统 免费开源代码 开发,分享 - CodeForge.cn...
  11. 如何借助大数据进行宏观经济分析
  12. 如何查看Hive版本
  13. java接口之双端队列
  14. 【Faster RCNN】损失函数理解
  15. [转载]通过插件支持,Geronimo 提供了 one-click 升级
  16. 测试打分用什么软件,测名软件哪个比较好
  17. WinSCP 连接 AWS 服务器
  18. QQ看点模块100条测试用例
  19. linux宿主机ssh访问windows10虚拟机
  20. Debian11安装搜狗输入法

热门文章

  1. Android如何 如何关闭 DM-verity
  2. WebService调用接口传参失败问题解决
  3. ActionForm详解
  4. 360面临两线作战----手机安全领域硝烟再起
  5. 计算机关机的DOS命令是,如何设置电脑自动关机dos指令
  6. geektool的cal命令格式乱了
  7. 论坛php网站模板,自适应discuz论坛门户网站模板
  8. java jdom 创建xml_java中使用jdom生成xml
  9. 阿里云搭建 ftp 服务器
  10. 信号添加百分比噪声的原理和方法