3、接口详解

转载请注明出处 --爱技术的华仔(http://blog.csdn.net/yunhua_lee)

 

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

有的人说:兄弟,给我提供一个“查询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

 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

 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

 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

 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

 

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

posted on 2015-12-31 10:09  重八  阅读(233)  评论(0编辑  收藏  举报

导航