看到一篇讲解生动有趣的博客  拿来分享一下

原文链接如下: 面向接口编程

开启故事之旅:

面向接口编程思想:

有一天,我想盖个房子,当然我自己是肯定盖不起来的,我要找村东头的强壮搬砖大哥,村南头的技术娴熟的砌墙师傅,村北头的水泥大哥和邻村的贴瓷砖师傅等。

我的计划是这样的:

先找人。

找到村东头的搬砖大哥,

找到村南头的砌墙师傅,

找到村西头的水泥大哥,

找到邻村里的瓷砖师傅,

然后,开工~

只要房子没盖好,就执行下面的步骤:

搬砖大哥去搬砖,

水泥大哥和水泥,

砌墙师傅来砌墙,

瓷砖师傅贴瓷砖。

而我,肯定被叫去装系统了,朴实的村民都知道程序员肯定会修电脑了!【哭】

翻译成java语言,就是以下代码:

public static void main(String args[]) {//我要盖房字了!//那么,我要先找人了~村东头搬砖大哥  banZhuan = new 村东头搬砖大哥();村南头砌墙师傅  qiQiang = new 村南头砌墙师傅();村西头水泥大哥  shuiNi = new 村西头水泥大哥();邻村贴瓷砖师傅  ciZhuan = new 邻村贴瓷砖师傅();//人找完了,开工~while( 房子没盖好 )  {banZhuan.搬砖();shuiNi.和水泥();qiQiang.砌墙();ciZhuan.贴瓷砖();}System.out.println("房子盖好了,收工");
}

第二天,开工~ 但是一直到中午12点,搬砖大哥都没来,而我去给二姑装系统去了,我还以为他们已经快把房子建好了呢,于是,,,,第一天就浪费了一天的时间。后来才知道他昨晚撸串吃坏了肚子,真是,,,,,,不怕胖吗???

相应的,在我们的代码中,banZhuan这个对象有bug,我们就不能用这个对象了。

这就是传统工作方式的弊端,一个工程里任何一部分出了问题,整个工程的进度都会受阻。即使世界上有很多搬砖大哥,但是我的计划是让村东头的搬砖大哥来,这是我和搬砖大哥约定好的,不能换人。(“不能换人”,这是非面向接口的弊端,建议看完这个例子后,仔细想想“换人”这个词)

几经周折,我的小房子终究还是盖起来了,但是我感觉整个人都不好了。

于是第二次我盖房子的时候(没错我又要盖房子了,因为我是土豪,真的),我在村东头歪脖树下贴了一张招聘广告,(由于村东头是我们村业余时间的聚集地,所以,大部分人都能看到这个广告),上面是这样的:

ladies and 相亲们,我要盖一个房子,现在需要以下人手:搬砖师傅,水泥师傅,砌墙师傅,瓷砖师傅各一位。有意者明天早上到我家门口报道,不用面试,能到就录取!工资500元/天,日结,报销上下班打车费(没错,我们村有texi,而且我是如此的任性)。

于是翻译成java就是这样:

public static void main(String args[]) {//我又要盖房子了!//找人~广告 guangGao=new 广告();搬砖大哥 banZhuan=guangGao.getBanZhuan();水泥大哥 shuiNi=guangGao.getShuiNi();砌墙师傅 qiQiang=guangGao.getQiQiang();瓷砖师傅 ciZhuan=guangGao.getCiZhuan();//开工while(房子没盖好) {banZhuan.搬砖();shuiNi.和水泥();qiQaing.砌墙();cizhuan.贴瓷砖();}System.out.println("房子又盖好了!");
}

这次,房子很快就改盖好了,在我看来这个过程是如此顺利。那么我们来分析一下,为什么这次我们的工作是如此的顺利?

和上次不同的是,我们这次找人的时候,并没有指名道姓要哪位师傅来,也就是没指名要村南头的砌墙师傅,而只说要一个会砌墙的师傅,这样,世界上所有会砌墙的时候都可以加入我们盖房子的队伍,这样,不管是谁又撸串吃坏了肚子都不会对我们的工程造成任何影响,因为我们的工程相比以前的工程要灵活很多,我们可以随意换人。还有一个小插曲,虽然在我看来整个过程是如此顺利,但是我不知道的是,村东头的搬砖大哥本来也想来应聘来着,但是他前一天晚上又撸串吃坏了肚子。但是我关心吗?I DON'T CARE。

搬砖大哥、砌墙师傅都是接口,他们可以是村东头的搬砖大哥,也可以是村南头的搬砖大哥,也可以是邻村的搬砖大哥,也可以是美国的搬砖大哥。这邻村的搬砖大哥和美国的搬砖大哥都是“搬砖大哥”这个接口的实现类。

什么是接口?

最后分享一下我对“接口”的理解,顺便解释一下“接口”为什么叫“接口”,这样会更好理解面向接口编程。接口,其实是从计算机硬件术语里借鉴来的。你可以看看电脑机箱的后面(或者笔记本的侧面),有很多插线的口,这些口就是“接口”,接线口嘛,这个很好理解吧,这些接口能干什么?可以插鼠标、键盘、摄像头、显示器……那为什么在造电脑的时候不把鼠标键盘什么的直接用电烙铁焊死在机箱里?接口各种各样,造接口也要成本啊,没有接口不就节约了成本吗?而且很多插口都是小白们不知道该插什么。当然这个问题大家都知道,方便换嘛。鼠标坏了,拔下来,把室友的拿过来插在自己的电脑上,又好用了~所以接口是干什么的,是“模块”间接头的地方,双方都不必知道对方是怎样的,机箱不知道接口那边的鼠标是雷蛇还是雷柏,鼠标也不知道接口那边是个台式机还是笔记本。

也就是说,电脑本身并不依赖某个品牌某个型号的鼠标,只要有插头差到机箱上就能用,也就是说电脑依赖的是插口,也就是接口。

记得在智能机还没登上历史舞台,各种山寨“音乐手机”可谓是喧嚣一时,声音大,屏幕大,内存大,还能上QQ,还有浏览器,关键是还便宜!那么这种手机为什么在很短的时间红极一时,又突然退出了历史的舞台?如果你拆开过这种手机,你会发现,除了电池,其他地方的零件都是焊死的,不能更换,如果手机有点小毛病,基本上就可以丢了,即使可以换,也要花好大的力气,但是更重要的是,虽然他有qq,有浏览器,但是这个QQ和浏览器是“定制的”,不能升级,更不能安装其他的软件。假如一个手机,出场的软件不可以卸载,不可以更新,也不能安装新软件,那,,,,,你想用吗?

另一方面,你可能会说是技术的进步,淘汰了那批山寨手机,但是现在的功能手机(只能打电话发短信的那种,我现在就有一个,应急用)也能在市场上占有一定的份额,怎么没被淘汰呢?

面向接口的核心思想就是,可更换。也就是解耦。

另一篇比较经典的面向接口编程思想的解答      解读面向接口编程的思想

面向对象的思想:

关于数据结构和面向对象

面向接口编程思想(面向对象思想)相关推荐

  1. 面向接口编程思想(转)

    http://www.cnblogs.com/Gavinzhao/archive/2009/11/10/1599700.html 本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必 ...

  2. 面向过程编程思想和面向对象编程思想

    一.面向过程编程思想 百度百科这样解释: "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想. 面向过程其实是最为实际的一种思考方式,就算是面向对象的 ...

  3. 面向接口编程和面向对象编程的区别

    我想,对于各位使用面向对象编程语言的程序员来说,"接口"这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为 ...

  4. 前端小白用面向对象思想实现元素拖拽

    上篇文章分享了如何用面向对象思想编写选项卡,在文章最后留了一个拖拽的例子,希望大家可以试着写一下,现在我就谈谈我在这过程中遇到的一些问题和解决方法.(本文主要是想和js初学者分享经验,代码中的更改th ...

  5. 树结构之树和二叉树的概念以及如何用面向对象思想进行结构定义01

    树和二叉树的概念及结构定义 前言 一.树的基本概念及代码层面如何定义 1.树的概念 2.代码层面树如何定义 二.二叉树的基本概念及代码层面如何定义 1.二叉树的概念 2.代码层面二叉树如何定义 3.二 ...

  6. IOS应用管理学习,进阶,涉及字典转模型,工厂方法,面向对象思想,页面布局等

    IOS应用管理学习,进阶,涉及字典转模型,工厂方法,面向对象思想,页面布局等 前言:人为规定的参数 每一个 小view视图 宽度 80 高度 90 数据类型 CGFloat 定义, 3 列,数据类型 ...

  7. 你知道如何用面向对象思想写好并发编程吗?

    在工作中,我发现很多人在设计之初都是直接按照单线程的思路来写程序的,而忽略了本应该重视的并发问题:等上线后的某天,突然发现诡异的 Bug,再历经千辛万苦终于定位到问题所在,却发现对于如何解决已经没有了 ...

  8. 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较

    一. 面向对象思想 1. 面向过程(OP)和面向对象(OO)的区别: (1):面向过程就是排着用最简单的代码一步一步写下去,没有封装,当业务复杂的时候,改动就很麻烦了 (2):面向对象将复杂的业务分离 ...

  9. linux 设备驱动总结,linux设备驱动归纳总结(三):3面向对象思想和lseek

    linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一.结构体struct file和struct inode 在之前写的函数,全部是定义了一些零散的全局变量.有没有办法整合 ...

  10. 面向对象思想----不看懊悔!

    面向对象思想----不看懊悔! 前言: 整理这份资料的目的是为了帮助朋友们可以更直观的理解面向对象的编程.让后来者可以少走一些弯路.但当中不免有很多漏洞及错误,也还 请前辈提出宝贵的更改意见,毕竟交流 ...

最新文章

  1. 用Django内置form组件实现注册
  2. python递归函数是指_python 函数递归作业求解析
  3. 一个运维老将的自我修养
  4. InputFormat和OutPutFormat
  5. 在stm32上使用Arduino IDE(神舟I号为例)
  6. PAT乙级 1015 德才论
  7. python opencv用法中文教程
  8. Java虚拟机(十一)——执行引擎
  9. 洛谷 P4549 【模板】裴蜀定理
  10. (1)vmware安装ubuntu13.10之后无法进入桌面;(2)ubuntu13.10无法显示eclipse的下拉菜单...
  11. libiconv android,iconv库 android ndk可运行
  12. 局域网视频共享 php,window_Windows 7媒体库管理音视频文件实现局域网共享, 任务分析 多台电脑连接的家 - phpStudy...
  13. 小米扫地机器人换了边刷很响_科沃斯除菌地宝N8 PRO VS 小米扫拖一体机,谁更强?...
  14. 开发者头条(一):导航页
  15. 【Java】Java学习笔记(5)——Java泛型作业函数题
  16. 统计与分布之伯努利分布与二项分布
  17. oracle用户 expire,Oracle 账号 EXPIRED(GRACE) 意义-拾亿
  18. Aziz 的 UiPath 工具面试经验
  19. 微信小程序格式化数字在插值语法里面使用
  20. 8B10B编解码原理与FPGA代码

热门文章

  1. SpringBoot更换Apache Log4 2.15.0-rc2j漏洞补丁
  2. 电子发票专用的邮箱—理票侠
  3. 360面临两线作战----手机安全领域硝烟再起
  4. JS的基本概念和语法
  5. GeekTool使用cal格式不对齐
  6. 什么是0day漏洞?如何预防0day攻击?
  7. 用php写出一个网站的模板,25 个 PHP 的 Web 开发程序网站模板
  8. 微信ubuntu版服务器,Ubuntu 18.04 安装微信(Linux通用)
  9. c语言:简单的客户管理系统
  10. 矩阵乘法c语言 2*3,2*3和2*2矩阵乘法公式