0

在尝试理解 java 中的接口时,我很难获得“啊哈”的时刻。根据 java 教程网站,他们在接口部分说:

通常,一家公司销售的软件包包含另一家公司希望在其自己的软件产品中使用的复杂方法。一个例子是出售给制作最终用户图形程序的公司的数字图像处理方法包。图像处理公司编写它的类来实现一个接口,它向客户公开。然后,图形公司使用接口中定义的签名和返回类型调用图像处理方法。虽然图像处理公司的 API 是公开的(向其客户),但其 API 的实现被严格保密——事实上,只要它继续实现原始接口,它可能会在以后修改实现其客户所依赖的。

我的问题与上面的解释有关。当他们说:Typically, a company sells a software package that contains complex methods that another company wants to use in its own software product

我很困惑。假设我已经定义了接口,并且我的实现类实现了该接口。我的客户将如何使用我正在创建的 API?它不像他们可以访问我的实现类,因为根据上面的描述,implementation of the API is kept as a closely guarded secret. 那么这是否意味着我提供给客户的只是一个用许多方法定义的接口。而实际的实现需要客户来做?请阐明整个概念和界面的使用。我不太明白。感谢和抱歉这个菜鸟问题

4

2 回答 2

4

也许一个例子可以提供帮助。

假设您有以下类/接口:

public interface ImageApi {
   Image create(int width, int height, Color c);
}

class ImageApiImpl implements ImageApi {
    @Override
    public Image create(int width, int height, Color c) {
       ... // implementation
    }    
} 

public ImageApiFactory {
    public static ImageApi getImageApi() {
        return new ImageApiImpl();
    }
}

客户端可以通过以下方式使用此 API:

ImageApi api = ImageApiFactory.getImageApi();
Image image = api.create(128, 128, Color.Blue);

现在让我们假设开发此 API 的公司找到了一种更快的创建图像的方法。不幸的是,新方法仅适用于 Windows 系统。他们将能够执行以下操作:

class FastImageApiImpl implements ImageApi {
    @Override
    public Image create(int width, int height, Color c) {
       ... // faster windows specfic implementation
    }    
} 

public ImageApiFactory {
    public static ImageApi getImageApi() {
        if (isWindowsSystem()) {
            return new FastImageApiImpl();
        }
        return new ImageApiImpl();
    }
}

客户端代码保持不变,因为两个 API 实现共享相同的接口。客户不知道具体的实现。

于 2013-10-20T15:14:29.420 回答
2

仅使用接口而不了解实现的一个很好的例子是 Java JDBC,它用于与数据库交互(查询、插入、删除、更新等)。

一旦建立到数据库的连接(我将在后面解释),用户就会引用一个Connection实例,它是一个接口。该接口具有创建各种 SQL 语句(它们是工厂方法)的方法,这些语句返回Statement接口的实现,执行时返回ResultSet接口的实现等。

从用户的角度来看,所有这些对象都只能通过界面进行交互。用户不知道也不关心实际的类名或实现细节是什么。

每个数据库公司都有自己专有的方式来实现他们不想与外界共享的一般数据库功能。Java 的创建者不可能为每种数据库实现所有可能的数据库实现,并且绝对不能为编写 JDBC 时尚不存在(或将来存在)的数据库类型实现实现。

因此,Java 没有附带任何 JDBC 接口的实现,只有接口定义。如果要使用 JDBC 与特定数据库进行通信,则需要提供一个附加的 jar 文件,其中包含该数据库的接口实现。一旦这些 jars 在类路径上,您就可以使用 JDBC 注册该实现,DriverManager以便它知道要使用哪些实现。

这有一个额外的好处,即能够非常轻松地更改数据库实现,而无需更改任何使用 JDBC 或 s 或 s 的代码ConnectionStatementResultSet只需给 DriverManager 一个新 jar。(这是假设您的语句不使用仅由某些数据库公司支持的非标准 SQL)

于 2013-10-20T16:14:47.370 回答