可能重复:
什么意思“程序接口”?
我一直跨越这个词来:
程序的接口。
究竟是什么意思? 现实生活中的设计方案将高度赞赏。
可能重复:
什么意思“程序接口”?
我一直跨越这个词来:
程序的接口。
究竟是什么意思? 现实生活中的设计方案将高度赞赏。
简单地说,而不是在说的方式写你的类
我靠这个特定的类做我的工作
你写的,说的方式
我靠,做这个东西做我的工作, 任何一类 。
第一个例子表示依赖于特定的具体实施做其工作的一类。 本质上,这是不是很灵活。
第二示例表示写入到一个接口的类。 它并不关心你用什么具体的对象,它只是在乎它实现了某些行为。 这使得该类更加灵活,因为它可以与任意数量的具体实现来完成工作来提供。
作为一个例子,特定类可能需要执行一些记录。 如果你写取决于TextFileLogger类,这个类是永远被迫将其日志记录写出到一个文本文件中。 如果您想更改日志记录的行为,你必须改变类本身。 类紧密加上其记录器。
但是,如果你写依赖的ILogger接口上,然后提供一个TextFileLogger该类的类,你会完成同样的事情,但被更灵活的好处。 你可以随意提供任何其他类型的ILogger的,在不改变类本身。 类及其记录器正在松散耦合,而你的类要灵活得多。
接口是一组相关方法的集合,只包含这些方法的签名 - 没有实际执行。
如果一个类实现一个接口( class Car implements IDrivable
),它必须在接口中定义的所有签名提供代码。
基本例如:
你必须类汽车和自行车。 这两种实现接口IDrivable:
interface IDrivable
{
void accelerate();
void brake();
}
class Car implements IDrivable
{
void accelerate()
{ System.out.println("Vroom"); }
void brake()
{ System.out.println("Queeeeek");}
}
class Bike implements IDrivable
{
void accelerate()
{ System.out.println("Rattle, Rattle, ..."); }
void brake()
{ System.out.println("..."); }
}
现在让我们假设你有对象,都是“可控”(他们班都实现IDrivable)的集合:
List<IDrivable> vehicleList = new ArrayList<IDrivable>();
list.add(new Car());
list.add(new Car());
list.add(new Bike());
list.add(new Car());
list.add(new Bike());
list.add(new Bike());
如果您现在要遍历该集合,你可以依赖这样的事实,即在集合实现每一个目标accelerate()
for(IDrivable vehicle: vehicleList)
{
vehicle.accelerate(); //this could be a bike or a car, or anything that implements IDrivable
}
通过调用接口方法你是不是针对实现,而是一个接口 - 这保证了通话对象实现某种功能的合同。
可以使用继承来实现相同的行为,但是从一个共同的基类结果,其中可以使用接口来避免紧耦合导出。
现实世界的例子是applenty。 其中之一:
对于JDBC,您正在使用的接口java.sql.Connection
。 然而,每个JDBC驱动程序提供了自己实现Connection
。 你不必知道具体的实现什么,因为它符合 Connection
接口。
另一条是从Java集合框架。 有一个java.util.Collection
接口,它定义size
, add
和remove
的方法(以及许多其他)。 所以,你可以互换使用所有类型的集合。 比方说,你有以下几种:
public float calculateCoefficient(Collection collection) {
return collection.size() * something / somethingElse;
}
这调用此一个其他两种方法。 其中的其他方法使用LinkedList
,因为它是因为它的目的更有效,而其他使用TreeSet
。
因为这两个LinkedList
和TreeSet
实现Collection
接口,您可以只用一个方法来执行系数计算。 无需复制你的代码。
而这里来了“节目的接口” -你不在乎究竟是size()
方法来实现,你知道它应该返回集合的大小-即你已经设定的Collection
接口,而不是LinkedList
和TreeSet
尤其如此。
但我的建议是要找到一个读 - 也许一本书(“在Java编程思想”为例) - 在这个概念进行详细解释。
多态性取决于面向接口编程,而不是执行。
有两个好处完全由抽象类定义的接口方面的操作对象:
这会大大减少子系统之间实现依赖关系,这导致了这种编程原理的接口。
见工厂方法模式这种设计的另一个理由。
来源:“ :设计模式可复用面向对象软件的元素通过GOF”
另请参见: 工厂模式。 当使用工厂方法?
每个对象都有暴露的接口。 集合具有Add
, Remove
, At
等一个socket可能已经Send
, Receive
, Close
等。
每个对象其实你可以得到一个参考到了具体实现这些接口。
这两个东西是显而易见的,但什么是有点不太明显...
您的代码不应该依赖的对象,只是其公布的接口的实现细节。
如果你把它发挥到了极致,你只对代码Collection<T>
等(而不是ArrayList<T>
更实际,只要确保你能在一些不破坏你的代码相同的概念互换。
为了敲定Collection<T>
例如:你有东西的集合,你实际使用ArrayList<T>
因为何乐而不为 。 你应该确保你的代码是不是要打破比如说,如果你最终使用LinkedList<T>
的未来。
“面向接口编程”发生在你使用库,其他代码,然后在自己的代码依赖。 然后,方式,其他代码表示自己给你,方法名,它的参数,返回值等弥补,你必须对编程接口 。 所以,它是关于如何使用第三方代码。
这也意味着,你不必去关心你所依赖的代码的内部,只要接口保持不变,你的代码是安全的(当然,或多或少...)
技术上也有更精细的细节,就像在Java中所谓的“接口”,例如语言的概念。
如果您想了解更多信息,你可以问“实现接口”是指...
我认为这是埃里希·伽玛的咒语之一。 我找不到他形容它(GOF书之前)的第一次,但你可以看到它在接受记者采访时在讨论: http://www.artima.com/lejava/articles/designprinciples.html
这基本上意味着你要使用你应该依靠是图书馆的只是部分的API(应用编程接口),并且你不应该的基础上的具体实现图书馆的应用。
例如。 假设你有给你一个库stack
。 类为您提供了几个方法。 比方说, push
, pop
, isempty
和top
。 你应该写你的应用程序只对这些依赖。 违反此的一种方法是里面偷看,并找出该堆栈使用某种类型的数组,这样如果你从一个空栈中弹出,你会得到某种指标的异常,并再搭上这不是实现依靠isempty
其中类提供方法。 如果库提供商使用数组来使用某种类型的列表,而后者将仍然工作假定提供者保留了他的API仍在工作切换前一种方法会失败。