1、Interface的作用: 统一标准,增强可扩展性,增强可复用性,对开发者而言只需要知道这几个接口。
最能说明接口有上述三种作用的例子:
①JAVA容器 ②Android ContentProvider ③JDBC
Interface List
{
boolean add(E o);
boolean remove(Object o);
……
}
public class ArrayList implements List //ArrayList内部数据以数组也就是线性表的形式存储
{
boolean add(E o)
{
……
}
……
}
public class LinkedList implements List //LinkedList 内部数据以链表的形式存储
{
boolean add(E o)
{
……
}
……
}
…… //还有各种各样实现了List的类
List<Student> studentContainer = new ArrayList<Student>();
studentContainer.add(student_1);
……
studentContainer.remove(student_3);
……
首先分析一下为什么说接口可以统一标准:
接下来如果我们想用不同的容器去实现student的存储,在不用接口统一情况下,各种容器里的方法可能写得五花八门,实现同一个功能函数其函数名叫什么的都有,其最终的结果是导致程序可读性差,可扩展性差,可复用性差。这时我们就需要用一组接口来作出一个统一。不管怎样你必须实现我这个接口。
(用JDBC的例子来说明:假设不用JDBC来统一接口,其最终的结果可能是每一家数据库厂商对其数据库操作的方法各不相同,而对于开发者而言每使用一种数据库都要写不同的访问方法)
为什么说增强可扩展性,增强可复用性:
对于上面的例子,如果我们想换成LinkedList 存储,我们只需要改一下
List<Student> studentContainer = new LinkedList<Student>(); //new ArrayList<Student>();改为new LinkedList<Student>();
studentContainer.add(student_1);
……
studentContainer.remove(student_3);
……
看到没,我们只需要修改一点,其他不用变。
为什么说:“对开发者而言只需要关心着几个接口,具体的实现不用你关心,你也没有必要关心”
正如:Android的ContentProvider,我们只需要使用ContentProvider所提供的接口,就可以完成对所有ContentProvider(例如 通讯/其他应用程序的数据库……)的访问。而不是对不同的访问对象写不同的访问方式。
object.functionName(para or not);
…… ------> 通讯录
------->其他应用程序的数据库
-------->……
具体的实现原理: 根据多态机制,找到对应的方法并执行。
2、在应用程序中定义接口,其作用也是上面所说的,那么在什么时候我们定义接口最合适。
①就像java中的容器一样,我们可能需要使用ArrayList来存储对象,也有可能需要使用LinkedList来存储对象,为了实现统一标准,可扩展性,可复用性,JAVA定义了一个List接口。 同样对于我们的应用程序定义接口,也是为了实现这个目的。