“计划到接口”。 这是什么意思? [重复] “计划到接口”。 这是什么意思? [重复](“

2019-05-08 21:15发布

可能重复:
什么意思“程序接口”?

我一直跨越这个词来:

程序的接口。

究竟是什么意思? 现实生活中的设计方案将高度赞赏。

Answer 1:

简单地说,而不是在说的方式写你的类

我靠这个特定的类做我的工作

你写的,说的方式

我靠,做这个东西做我的工作, 任何一类

第一个例子表示依赖于特定的具体实施做其工作的一类。 本质上,这是不是很灵活。

第二示例表示写入到一个接口的类。 它并不关心你用什么具体的对象,它只是在乎它实现了某些行为。 这使得该类更加灵活,因为它可以与任意数量的具体实现来完成工作来提供。

作为一个例子,特定类可能需要执行一些记录。 如果你写取决于TextFileLogger类,这个类是永远被迫将其日志记录写出到一个文本文件中。 如果您想更改日志记录的行为,你必须改变类本身。 类紧密加上其记录器。

但是,如果你写依赖的ILogger接口上,然后提供一个TextFileLogger该类的类,你会完成同样的事情,但被更灵活的好处。 你可以随意提供任何其他类型的ILogger的,在不改变类本身。 类及其记录器正在松散耦合,而你的类要灵活得多。



Answer 2:

接口是一组相关方法的集合,只包含这些方法的签名 - 没有实际执行。
如果一个类实现一个接口( 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
}

通过调用接口方法你是不是针对实现,而是一个接口 - 这保证了通话对象实现某种功能的合同。
可以使用继承来实现相同的行为,但是从一个共同的基类结果,其中可以使用接口来避免紧耦合导出。



Answer 3:

现实世界的例子是applenty。 其中之一:

对于JDBC,您正在使用的接口java.sql.Connection 。 然而,每个JDBC驱动程序提供了自己实现Connection 。 你不必知道具体的实现什么,因为它符合 Connection接口。

另一条是从Java集合框架。 有一个java.util.Collection接口,它定义sizeaddremove的方法(以及许多其他)。 所以,你可以互换使用所有类型的集合。 比方说,你有以下几种:

public float calculateCoefficient(Collection collection) {
    return collection.size() * something / somethingElse;
}

这调用此一个其他两种方法。 其中的其他方法使用LinkedList ,因为它是因为它的目的更有效,而其他使用TreeSet

因为这两个LinkedListTreeSet实现Collection接口,您可以只用一个方法来执行系数计算。 无需复制你的代码。

而这里来了“节目的接口” -你不在乎究竟是size()方法来实现,你知道它应该返回集合的大小-即你已经设定的Collection接口,而不是LinkedListTreeSet尤其如此。

但我的建议是要找到一个读 - 也许一本书(“在Java编程思想”为例) - 在这个概念进行详细解释。



Answer 4:

多态性取决于面向接口编程,而不是执行。

有两个好处完全由抽象类定义的接口方面的操作对象:

  1. 客户仍然不知道具体的类型,他们使用对象的,只要对象坚持认为客户期望的接口。
  2. 客户仍然不知道实现这些对象的类。 客户只知道抽象类(ES),其定义界面。

这会大大减少子系统之间实现依赖关系,这导致了这种编程原理的接口。

见工厂方法模式这种设计的另一个理由。

来源:“ :设计模式可复用面向对象软件的元素通过GOF”

另请参见: 工厂模式。 当使用工厂方法?



Answer 5:

每个对象都有暴露的接口。 集合具有AddRemoveAt等一个socket可能已经SendReceiveClose等。

每个对象其实你可以得到一个参考到了具体实现这些接口。

这两个东西是显而易见的,但什么是有点不太明显...

您的代码不应该依赖的对象,只是其公布的接口的实现细节。

如果你把它发挥到了极致,你只对代码Collection<T>等(而不是ArrayList<T> 更实际,只要确​​保你能在一些不破坏你的代码相同的概念互换。

为了敲定Collection<T>例如:你有东西的集合,你实际使用ArrayList<T>因为何乐而不为 。 你应该确保你的代码是不是要打破比如说,如果你最终使用LinkedList<T>的未来。



Answer 6:

“面向接口编程”发生在你使用库,其他代码,然后在自己的代码依赖。 然后,方式,其他代码表示自己给你,方法名,它的参数,返回值等弥补,你必须对编程接口 。 所以,它是关于如何使用第三方代码。

这也意味着,你不必去关心你所依赖的代码的内部,只要接口保持不变,你的代码是安全的(当然,或多或少...)

技术上也有更精细的细节,就像在Java中所谓的“接口”,例如语言的概念。

如果您想了解更多信息,你可以问“实现接口”是指...



Answer 7:

我认为这是埃里希·伽玛的咒语之一。 我找不到他形容它(GOF书之前)的第一次,但你可以看到它在接受记者采访时在讨论: http://www.artima.com/lejava/articles/designprinciples.html



Answer 8:

这基本上意味着你要使用你应该依靠是图书馆的只是部分的API(应用编程接口),并且你不应该的基础上的具体实现图书馆的应用。

例如。 假设你有给你一个库stack 。 类为您提供了几个方法。 比方说, pushpopisemptytop 。 你应该写你的应用程序只对这些依赖。 违反此的一种方法是里面偷看,并找出该堆栈使用某种类型的数组,这样如果你从一个空栈中弹出,你会得到某种指标的异常,并再搭上这不是实现依靠isempty其中类提供方法。 如果库提供商使用数组来使用某种类型的列表,而后者将仍然工作假定提供者保留了他的API仍在工作切换前一种方法会失败。



文章来源: “Program to an interface”. What does it mean? [duplicate]
标签: java oop