连载:面向对象葵花宝典:思想、技巧与实践(8) - “接口” 详解

本文主要是介绍连载:面向对象葵花宝典:思想、技巧与实践(8) - “接口” 详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接口”是我见过的面向对象领域中滥用、乱用、误用最多的术语

有的人说:兄弟,给我提供一个“查询XXX”的接口。。。。。。

有的人说:系统对外提供了“查询”、“插入”、“更新”、“删除”4个接口。。。。。。

有的人说:我们要基于“接口”编程。。。。。。

有的人说:你这样做破坏了我们的接口设计。。。。。。

。。。。。。。。。。。

倒不是在这里指责他们的水平有多差,而是接口这个属于的中文翻译确实难以理解。

台湾译为介面,仲介之面的意思;大陆译作界面,也译作接口,但无论是“界面”、“介面”、“仲介之面”还是“接口”,都远远没有“类”、“对象”那么直白和容易理解。

 

既然中文很难理解,那么我们从英文入手,看看是否会有什么新的发现。

“接口”英文为“interface”,按照英文的方法将其拆开,其实就是“inter – face”,也就是说其包含两层意思:

【Inter】: 互相,与互相对应的是单个、多个,为什么这里要强调2个呢?

首先,“单个”不存在交互,你自己玩自己的,别人管不了,也就没法交互了;

其次,“多个”交互就混乱了,比如说,假设一个USB接口能够同时接鼠标和键盘,那么怎么知道收到的信号时谁发出的,发出的信号又是要发给谁呢?

 

【Face】:面,与面对应的是点、线,这里为什么要强调“面”呢?

 首先,“面”很形象,围着你的电脑看一下,USB接口、网络接口、VGA接口,形状是不是都是“面”?

其次,“面”体现了功能的多样性。即:接口包含多个“功能点”,例如:USB接口有输入功能、输出功能、充电功能,这三个功能都是USB接口具备的,而不是三个接口。

 

基于上述分析,我们可以给接口下一个清晰和容易理解的定义:接口是一组相关的交互功能点定义的集合

这个定义的三个关键点详细解析一下:

【相关】

接口中包含的功能点是相关的,而不是一堆无关功能的堆砌。

例如USB接口,你见过既支持USB协议、又支持VGA协议、还支持PS/2的接口么?

 

【交互】

接口是用于不同物体交互,如果只是自己玩,那么就不能成为接口;

 

【定义】

接口中的功能点只是定义,并不涉及具体实现。

也就是说,接口是一个交互协议,是交互双方的一个约定,但具体如何实现,由具体的交互实体各自实现即可。

就像USB接口,张三可以接鼠标、李四可以接键盘、王五可以接散热风扇,但无论是鼠标、键盘还是风扇,都必须遵循USB接口的协议标准。

 

【集合】

接口是多个功能点的集合,而不是一个具体的功能点。

 

但如果你说要我重新将interface翻译成简单易理解的中文,恕我才能不够,我也没法翻译。

 

回过头来看本章前面提到的关于接口的不同说法:

有的人说:兄弟,给我提供一个“查询XXX”的接口——这里说的是一个功能

有的人说:系统对外提供了“查询”、“插入”、“更新”、“删除”4个接口——这里说的是多个功能,这些功能合起来才是一个完整的接口

有的人说:我们要基于“接口”编程——这个符合接口的定义

有的人说:你这样做破坏了我们的接口设计——这个可能符合接口的定义,也可能不符合,关键看这里的接口是指某个功能还是一组功能。

 

Java语言中的接口很好的展现了接口的含义:

IAnimal.java

[java]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. package com.oo.demo;  
  2.   
  3. public interface IAnimal {  
  4.   
  5.     /* 
  6.      * Java的Interface很好的体现了我们前面分析的接口的特征: 
  7.      * 1)是一组功能的集合,而不是一个功能 
  8.      * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作 
  9.      * 3)接口只定义函数,但不涉及函数实现 
  10.      * 4)这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal里面了 
  11.      */  
  12.     public void eat();  
  13.     public void run();  
  14.     public void sleep();  
  15.     public void speak();  
  16. }  

Pig.java

[java]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. package com.oo.demo;  
  2. /** 
  3.  * “猪”的类设计,实现了IAnnimal接口 
  4.  * 
  5.  */  
  6. public class Pig implements IAnimal{  
  7.   
  8.     //如下每个函数都需要详细实现  
  9.     public void eat(){  
  10.           
  11.         System.out.println("Pig like to eat grass");  
  12.     }  
  13.       
  14.     public void run(){  
  15.           
  16.         System.out.println("Pig run: front legs, back legs");  
  17.     }  
  18.       
  19.     public void sleep(){  
  20.           
  21.         System.out.println("Pig sleep 16 hours every day");  
  22.     }  
  23.       
  24.     public void speak(){  
  25.           
  26.         System.out.println("Pig can not speak");  
  27.     }  
  28. }  

Person2.java

[java]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. package com.oo.demo;  
  2. /** 
  3.  * 实现了IAnimal的“人”,有几点说明一下: 
  4.  * 1)同样都实现了IAnimal的接口,但“人”和“猪”的实现不一样, 
  5.  *    为了避免太多代码导致影响阅读,这里的代码简化成一行,但输出的内容不一样, 
  6.  *    实际项目中同一接口的同一功能点,不同的类实现完全不一样 
  7.  * 2)这里同样是“人”这个类,但和前面介绍类时给的类“Person”完全不一样, 
  8.  *    这是因为同样的逻辑概念,在不同的应用场景下,具备的属性和功能是完全不一样的 
  9.  * 
  10.  */  
  11. public class Person2 implements IAnimal {  
  12.   
  13.     public void eat(){  
  14.           
  15.         System.out.println("Person like to eat meat");  
  16.     }  
  17.   
  18.     public void run(){  
  19.           
  20.         System.out.println("Person run: left leg, right leg");  
  21.     }  
  22.   
  23.     public void sleep(){  
  24.           
  25.         System.out.println("Person sleep 8 hours every dat");  
  26.     }  
  27.   
  28.     @Override  
  29.     public void speak(){  
  30.           
  31.         System.out.println("Hellow world, I am a person");  
  32.     }  
  33.   
  34. }  

Tester03.java

[java]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. package com.oo.demo;  
  2. /** 
  3.  * @author liyunhua 
  4.  * 
  5.  */  
  6. public class Tester03 {  
  7.   
  8.     public static void main(String[] args) {  
  9.           
  10.         System.out.println("===This is a person===");  
  11.         IAnimal person = new Person2();  
  12.         person.eat();  
  13.         person.run();  
  14.         person.sleep();  
  15.         person.speak();  
  16.           
  17.         System.out.println("\n===This is a pig===");  
  18.         IAnimal pig = new Pig();  
  19.         pig.eat();  
  20.         pig.run();  
  21.         pig.sleep();  
  22.         pig.speak();  
  23.   
  24.     }  
  25.   
  26. }  

有了类之后为什么还要有接口呢?我直接用类不行么?

例如,我想操作人的时候就用Person,我想操作猪的时候就用Pig

 

大部分情况下这样做是可以的,但有的时候,你可能并不知道你面对的是一个人还是一头猪,因为这个动物可能是别人创建的,或者是上帝创建的。你只知道这是个动物,但你又希望这个动物按照你的要求进行活动。这就是接口的用处所在,即:你不知道一个对象所属的具体“类”,只知道这些对象都具备某种功能


个人总结:接口是一组相关的交互功能点定义的集合。接口中声明了要实现的操作,没有具体的实现方法、。通过定义接口让摸一个类来实现这个接口,来定义这个类要实现什么功能。

这篇关于连载:面向对象葵花宝典:思想、技巧与实践(8) - “接口” 详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134972

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP