接口的定义我就不说啊。 我说说接口的现实意义吧。
1. 从需求上来说:接口体显了你需求分析的结果。它是需求分析后的产物。你在做完需求分析后,完全可以得到一个系统各部所需要的方法。记住,它只反应了系统想要做些什么,而不是系统该怎么做。当你认为你所定义的接口完全满足了需求中的全部功能时,最好通过手工的方式模拟系统的运行。
举个例子,你可以一边看着你的用例图和序列图(不仅仅是这些),一边“调用”你的接口中的方法。这个调用是指在你的头脑中调用。你就直接假设所有的实现都已经完成,并且非常正确。
如果在你的头脑中系统“运行”的很好。说明你完成了系统上层的设计工作(前提是你的需求是正确的)。接下来你可以针对你所设计的接口做应对于“在接口所定义的方法下不同需求的不同的实现”来实现对相同的业务不同的业务规责的多态性。记住接口是实现多态性的机制(当然,抽象类也可以)。
2. 从设计角度来分析:java提倡的是针对抽象编程(其实只要是面向对象的语言都应如此)。具体的意思就是客户端应该只依赖于抽象的东西。再具体一点来说,就是说白了,客户端应该只针对接口来编程。不要针对具体的实现,这样当实现这个接口的业务规则发生了变化,你只需要改动后面的实现,而不影响客户端,因为客户端根本不知道你已经“偷偷地”改变了方法的具体实现。这使得系统一处发生了变化,对系统的影响范围减至最少。顺便说一下“客户端”的概念,客户端不是用户端。客户端是相对的,A 调用了 B ,A就叫做B的客户端,B是A的服务端.一般来讲,一个系统中,上层是下一层的客户端。下一层是上一层的服务端。一个系统的各部分可能相互调用,那它们之间也是客户端和服务端的关系。服务端只提供给客户端必要的方法。当系统各部分之间针对于抽象(具体就是通过接口),来相互调用的话,各部分之间就有了一个稳定的“契约”,它们都以这个契约为准相互沟通,而彼此都不知道对方是如何实现的。这样的话,你就有很大的余地来选择每部分的具体实现细节,怎么实现。从而一点都不影响它们的客户端。这种情况在实现规则发生改变你需要重写实现时体现的最为明显。这也是针对抽象编程的原因。
3. 从面向对象的角度看:面向对象技术为我们提供了许多好的特征。比如:信息隐藏,多态。实现信息隐藏的手段是封装,而实现多态的手段就是继承。(接口的实现可以看做是一种继承,虽然它没有从“父亲”那里继承任何东西,但它还是你的父亲 ^_^)。运用接口我们可以充份运用多态的特性。要知道,多态是面向对象中最为重要的特性之一。如果你不用接口或抽象类,而只是直接用每个具体的类做事情,那可以说你大概从面向对象这里仅仅取得了一点封装信息的好处,而失去了多态这个最大的好处。这样的程序并不是真正运用了面向对象的技术。所以用面向对象,最主要的就是在用它的多态性质。而使用接口正是通往多态大道。
以上是我从我的经验中总结的一点个人意见。大家继续讨论一下。
我再写一个例子体显一下接口带来的多态性吧:
//这是一个接口,Vehicle是交通工具的意思,这个接口定义了交通工具的一个共有的方法
//drive()驾驶
public interface InfVehicle {
public void drive();
}
//小汽车是交通工具,实现交通工具的接口
public class Car implements InfVehicle {
public void drive() {
//这里具体实现小汽车的驾驶方法
}
}
//自行车也是交通工具,实现了交通工具的接口
public class Bicycle implements InfVehicle {
public void drive() {
//这里具体实现自行车的驾驶方法
}
}
//这是一个“人”类,它有一个方法是 goHome回家,回家需要一种交通工具,所以他有一个交通工具,他回家时使用这个工具
public class Man {
private InfVehicle vehicle;
public InfVehicle getVehicle() {
return this.vehicle;
}
public void setVehicle(InfVehicle vehicle) {
this.vehicle = vehicle;
}
//回家方法
public void goHome() {
this.vehicle.drive();
}
}
现在我们来看怎么使用这些类
Man aMan = new Man();
//创建一个"人"
InfVehicle car = new Car();
//创建一个小汽车
InfVehicle bicycle = new Bicycle();//创建一个自行车
//比如今天这个人想开车回家,我们就
aMan.setVehicle(car);
aMan.goHome();
//如果他开车开腻了,想换一种方式,他这可以骑车回家
aMan.setVehicle(bicycle);
aMan.goHome();