我们可以将面向接口编程简单理解为,从解决一件事扩展到解决一类事

案例源码在文章末尾,自取

为什么会有接口一说?

可能这么说还比较抽象,那么就用我们熟知的电脑做案例解释下


        众所周知,原始的鼠标使用的是圆形的插口,可以理解为圆形的接口,如下代码

    public interface Circle{     void Connect();//圆孔鼠标的连接功能}

但圆形插口扩展性不好,只能支持鼠标一种外设    其他设备需要另外开辟接口,这样下去迟早资源耗尽
    这时一堆dalao聚集在一起,约定了USB协议(接口)

    public interface USB{        void Connect();//USB设备的连接功能}

只要实现了USB接口的外接设备,都可以通过USB被电脑所识别

所以直接(在数不胜数的程序员和大牛在度过了的那一个个令人头秃的凌晨后终于)有了面向接口编程的思想
    所以,只要对象实现了特定功能的接口,他就能通过该相同的接口完成各种各样的事情

直接的用途是,每出一件电脑外设,只要它遵循USB接口(协议),它就能连入电脑工作

那么问题来了,这和我们程序员有什么关系呢?
    不知道大家发现没有,这里每一件外设只要遵循USB接口(协议)就能正常工作

我们不用为每一件新出的外设单独编写程序了!!!

关于外设是如何实现USB接口的,厂商以外的人是无法知道的,这是厂商所希望的

这时,就实现了外设在电脑上工作和对USB接口实现的分离

厂商的铁饭碗保住了,程序员的工作量也有所减轻

故事讲完了,下面开始上代码

using System;
namespace InterfaceExample
{//向上提取,得到大部分外设都遵守的USB接口(协议),只要外接实现该接口,就可以连入电脑public interface USB{      void Connect();//USB设备的连接功能}public class Mouse : USB{//让鼠标遵循USB协议,实现鼠标与电脑间连接和断开的功能public void Connect(){ //这里用一句输出语句,模拟鼠标实现USB接口的操作Console.WriteLine("鼠标成功接入电脑!");}}public class Keyboard : USB{//让键盘遵循USB协议,实现键盘与电脑间连接和断开的功能public void Connect(){Console.WriteLine("键盘成功接入电脑!");}}//扩展到任意一个外接设备public class OutDevice : USB{//这是任意一个外接设备,它实现了USB接口public void Connect(){Console.WriteLine("外接设备成功接入电脑!");}     }//上面的这些就是外设生产商(键盘生产商、鼠标生产商)的铁饭碗}

生产商如何使外设实现USB接口的其他人都无法知道
    但是我们可以通过他们都实现了的USB接口来运行他们
    可以类比:把键盘和鼠标USB插进电脑,就可以正常使用了!

class USBInterface{//所以,这里我们定义了一个将外设连接入电脑的功能public static void ConnectComputer(USB usb){usb.Connect();}public static void Main(string[] args){//厂商生产了一个键盘一个鼠标和一个任意外设Keyboard keyboard = new Keyboard();Mouse mouse = new Mouse();OutDevice outdevice = new OutDevice();//用户通过USB接口将三个设备连接入电脑ConnectComputer(keyboard);ConnectComputer(mouse);ConnectComputer(outdevice);Console.ReadLine();}}

这样我们就将鼠标键盘推广到了任意的外设,只要外设实现了USB接口(协议),它就能和电脑建立联系,正常工作

最后引用某位网友的问答

1 首先什么是面向接口编程?

面向接口编程就是先把客户的业务逻辑线提取出来,作为接口,业务具体实现通过该接口的实现类来完成。
当客户需求变化时,只需编写该业务逻辑的新的实现类,通过更改配置文件(例如Spring框架)中该接口
的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。

2 面向接口编程的优点?

降低程序的耦合性。其能够最大限度的解耦,所谓解耦既是解耦合的意思,它和耦合相对。耦合就是联系 ,耦合越强,联系越紧密。在程序中紧密的联系并不是一件好的事情,因为两种事物之间联系越紧密,你更换 其中之一的难度就越大,扩展功能和debug的难度也就越大。
易于程序的扩展;
有利于程序的维护;

PS:为了内容理解的难易程度,请读者不要纠结历史细节问题

源码链接

https://www.jianshu.com/p/62ca1ed84cc5

面向接口编程之粗暴理解相关推荐

  1. java 用面向接口编程的方式开发打印机_Java面向接口编程之简单工厂模式示例

    本文实例讲述了Java面向接口编程之简单工厂模式.分享给大家供大家参考,具体如下: 一 代码 interface Output { // 接口里定义的成员变量只能是常量 int MAX_CACHE_L ...

  2. 对面向接口编程的理解

    好久不写日志了,今天来谈谈这几天找工作的感受及最近的学习收获! 首先环顾一下大环境,周围的同学很多都已经找到工作了.个人认为有的在学习的努力程度上还比不上我,但现在每个月就是能拿上1~2k块钱,当然我 ...

  3. 简单粗暴理解与实现机器学习之逻辑回归:逻辑回归介绍、应用场景、原理、损失以及优化...

    作者 | 汪雯琦 责编 | Carol 来源 | CSDN 博客 出品 | AI科技大本营(ID:rgznai100) 学习目标 知道逻辑回归的损失函数 知道逻辑回归的优化方法 知道sigmoid函数 ...

  4. java 面向接口编程的理解

    初学者可能在学习中会有很多疑惑,为什么要这样,明明可以那样实现,这样做的好处又是什么? 可能会的人觉得很简单很容易理解,甚至可能觉得问的问题很智障,但对于小白来说可能是苦思冥想都不得其解的. 自己身为 ...

  5. Scala教程之:深入理解协变和逆变

    文章目录 函数的参数和返回值 可变类型的变异 在之前的文章中我们简单的介绍过scala中的协变和逆变,我们使用+ 来表示协变类型:使用-表示逆变类型:非转化类型不需要添加标记. 假如我们定义一个cla ...

  6. java多线程之volatile理解

       最近一直在看多线程的一些知识,看了一些书和一些博客,收获还是挺多的,最近看了<java并发编程的艺术>这本书感觉收获很大也推荐给各位,同时也结合以前看的博客就好好的总结一下自己所学的 ...

  7. 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    K-近邻算法 文章目录 K-近邻算法 学习目标 1.3 距离度量 1 欧式距离**(Euclidean Distance):** 2 **曼哈顿距离(Manhattan Distance):** 3 ...

  8. 简单粗暴理解支持向量机(SVM)及其MATLAB实例

    目录 SVM概述 SVM的改进:解决回归拟合问题的SVR 多分类的SVM QP求解 SVM的MATLAB实现:Libsvm [实例]用SVM分类 [实例]用SVM回归 SVM概述 SVM已经是非常流行 ...

  9. 简单粗暴理解与实现机器学习之K-近邻算法(十):交叉验证,网格搜索(模型选择与调优)API、鸢尾花案例增加K值调优

    K-近邻算法 文章目录 K-近邻算法 学习目标 1.10 交叉验证,网格搜索 1 什么是交叉验证(cross validation) 1.1 分析 1.2 为什么需要交叉验证 **问题:那么这个只是对 ...

最新文章

  1. 虚拟机+CentOS内核hack7、8、9、17失败记
  2. linux环境下c语言的学习--linux下的基本操作
  3. 【读书笔记】泛型接口 和 泛型方法
  4. ArcGIS实验教程——实验十八:叠置分析(Overlay Analysis)
  5. jvm(12)-java内存模型与线程
  6. javaone_代理的JavaOne 2016观察
  7. 1.搭建JavaEE开发环境
  8. 数据源绑定控件的Row/ItemDataBound事件
  9. 荣耀Magic4性能体验超苹果再次实锤!非官方游戏性能对比出炉
  10. unittest和另一个可用单元测试框架nosetest
  11. asp.net core mvc 项目搭建 二、hplus UI【干货教程】
  12. 【MINI2440】linux系统下载全流程
  13. windows10桌面图标异常,显示为白色图标
  14. EditPlus设置远程连接Linux管理文件
  15. 生物信息学(3)——双序列比对之BLAST算法简介
  16. java jtextarea滚动条下滑,JTextArea更新时滚动条自动在最上面或者在最下面的方法...
  17. X猜想:比尔离开后的微软帝国
  18. 腾讯是如何做Unity手游性能优化的
  19. 卖了的微信能不能找回_我把微信卖了,然后我建议微信客服把我的微信注销了。那个收微信的干坏事会找到我吗?...
  20. 水经注离线影像地图读取控件的二次开发教程

热门文章

  1. 〖ChatGPT实践指南 - 零基础扫盲篇②〗- 深度体验 ChatGPT
  2. 基于c++和asio的网络编程框架asio2教程基础篇:1、基本概念和使用说明
  3. 周赛 Newstar 解题
  4. Go 语言入门三部曲(二):能用 Go 语言写管理系统
  5. 单片机串口高效收发数据的实现方法
  6. Web点播播放器1.0——腾讯sdk网页点播播放器
  7. Jenkins 持续集成环境快捷部署
  8. 将images按照2:1:1的比例随机分成train,validate,test
  9. 苏州文正学院计算机张晓青,北流市地图(广西政区图地图)
  10. esp32之点亮一盏灯