为什么分离界面和实现?

时间:2015-05-29 16:25:22

标签: java design-patterns architecture

在生产代码中,我经常看到如下定义的类:

public interface SomeComponent { // Some methods }
public class SomeComponentImpl implements SomeComponent { // Some methods}

public interface SomeComponentV2 extends SomeComponent { // Some methods }
public class SomeComponentV2Impl extends SomeComponentImpl implements SomeComponent { // Some methods }

为什么在这种情况下我们想要分离接口及其实现?

或者这样说,为什么简单地拥有一个基类,让V2扩展/覆盖V1如下:

public class SomeComponent { // Some methods }
public class SomeComponentV2 extends SomeComponent 
{
  // Override methods for reimplementation
  // Add new methods for new features.
}

2 个答案:

答案 0 :(得分:1)

将接口和类的实现分开是一个很好的做法,因为您可以轻松地交换类。

想象一下,您想要测试依赖于Web服务的应用程序,该服务会为您的每个请求收取费用。除了有一个对此Web服务执行实际请求的类之外,您还可以构建一个实现相同接口但返回虚假数据的类,以避免为每个请求生成成本。

每次从基类继承时,您都有可能继承您根本不想继承的行为。接口是纯合约,让您可以自由选择基础类,而不受所述优势的影响。

答案 1 :(得分:0)

将接口与实现分离可以完全使用多态。 这样,SomeComponentV2Impl将有3种类型 - 拥有,基类和接口。 在这里,您可以只使用界面而不关心它在其他课程中的实现。例如:

git submodule add git://github.com/whomsoever/whatever.git

[编辑:此问题出现在编辑前的OP问题中]

为什么我们不为它们使用一个基类?

因为SomeComponentV2Impl与SomeComponentImpl不同。 但如果他们实现相同的界面,您将能够从界面的参考中调用他们的实现。