java - 什么是针对接口(interface)编程而不是针对实现编程

标签 java design-patterns

Possible Duplicate:
What does it mean to “program to an interface”?

首先,我认为术语“接口(interface)”和java中的“接口(interface)”之间存在区别,但我不太明白它们的区别是什么。

当它说“编程到接口(interface)而不是实现”时,我的第一个问题是指接口(interface)还是java接口(interface)?

我正在阅读头头设计模式,我对接口(interface)编程而不是接口(interface)编程感到困惑 执行。我的理解是,子类是具体实现,接口(interface)是 SUPERCLASS(接口(interface)或抽象类或简单类)。

我的第二个问题是,当他们说对接口(interface)进行编程时,这意味着代码位于接口(interface)(父类(super class))中,然后子类只是继承了它?如果他们说对实现(子类)进行编程,则代码位于子类中? 我之所以想到这一点是因为术语“重用”,因为如果您更改代码并且您的代码位于子类(具体实现)中,那么您需要更改所有子类代码,那么如果您将代码放在接口(interface)中只需要更改该界面中的代码即可。

还有接口(interface)编程和实现的示例(请简单一些)会有所帮助。

第三个问题,如果我们对接口(interface)进行编程比对具体类进行编程有什么优势?

最佳答案

首先我必须说我没有读过那本书,所以我不能肯定这就是作者的意思,但这就是我对这句话的理解。

我对其含义的理解是,您应该以将类和方法视为黑匣子的方式进行编程,您不依赖于某些内部机制及其工作方式,而是依赖于规范您或其他人在接口(interface)、父类(super class)、文档等中定义。这样您就可以轻松更改实现,而不会影响代码库的其余部分。

一个很好的例子可能是存储一些数据的序列,比如说名称。您可以定义函数来添加新名称、删除它们和打印它们。如果您在像下面这样的接口(interface)中定义这些函数,则可以使用它们,而不必担心实现它们的类是否使用数组或列表来存储它们。

interface Sequence {
    void add(String s);
    void delete(String s);
    void print();
}

现在您可以创建一个实现该接口(interface)的类 SequenceAsList 并在您的应用程序中使用它。假设一切正常,但您现在决定,也许在某些地方您提前知道序列中的项目数,并且需要更好的性能,因此您想使用数组而不是列表。因此,您可以创建另一个也实现 Sequence 接口(interface)的类 SequnceAsArray。现在您需要在代码中更改的所有内容都将执行

Sequence someSequence = new SequenceAsArray();

而不是

Sequence someSequence = new SequenceAsList();

因为它们遵循相同的界面,所以很容易做到这一点。因此我认为作者主要建议的是采取这种将类和方法视为黑匣子的方法。

关于java - 什么是针对接口(interface)编程而不是针对实现编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10263413/

相关文章:

java - 限制 SonarQube 中每行相同检查的问题

java - 如何将句子输入到HashMap中

java - 不走视觉理想路线的星型算法

java - 如何通过 XPATH 解析 XML 文件

C++ 和 UML 图

java - TreeMap 随机停止正确返回值

java - Swing应用程序多线程设计模式和最佳实践

java - 这段代码是适配器模式的示例吗?

ios - 沿路径绘制图案

Python:**args 而不是重载?