关于java:什么是基于接口的框架?

What is Interface-based framework?

我正在通过有效的Java和读取静态工厂方法来创建对象。其第2章第1项。在第三个优势中,作者提到了

Hiding implementation classes in this fashion can lead to a very compact API. This technique lends itself to interface-based frameworks, where interfaces provide natural return types for static factory methods.

我不明白基于接口的框架是什么?


也许重新表述一下会有所帮助:基于接口的框架是一个框架,它只允许用户/客户机lib访问接口,而实际上只提供实现这些接口的类。这种方法的好处在于给实现者对实现的完全控制权,同时给客户端一个稳定的API,最近我遇到了一个例子,客户端从API方法得到一个XmlProcessor。在框架内,这个处理器有三种完全不同的实现:DomXmlProcessorSaxXmlProcessorVtdXmlProcessor。个别实现的细节与客户机无关,可以随时切换。


基于接口的框架是用接口及其实现来设计的框架。

集合框架是基于接口的框架的一个很好的例子。

Hiding implementation classes in this fashion can lead to a very compact API

你只需要创建一个界面

1
2
3
4
interface Animal{
 public void eat();//hiding the implementation
 public  Animal getAnimalInstance();//factory method
}

您的实现者将负责实现。

您的API使用者将像我们在集合中那样直接使用接口

1
List<String> list = new ArrayList<String>();

也看到

  • 最好在Java中使用接口


当你设计软件,有核心设计原则帮助管理的复杂性,参与复杂的A搜索任务。

一个核心原则是环境问题的一个复杂的subdivide smallers,设法和容易理解。

合同是在界面上。它定义了一个服务类必须符合和如何使用它。外部接口隐藏在一个或几个可能的实现细节的合同。

一个典型的Java应用程序设计接口,将一个模型为核心的合同提供的不同部分的软件。实现的细节是隐和因此允许减少的复杂性。

是说你让更多的混凝土,设计会计应用。所有客户提供同样的服务:让电流基本平衡,寻求信贷或货币,总结过去的作战要求。你可以定义一种接口,这样所有的帐户要符合:

1
2
3
4
5
6
7
8
9
10
11
public interface Account {

  double getBalance();

  void credit(double amount);

  void withdraw(double amount);

  List<Operation> getOperations(Date startDate, Date endDate);

}

这一定义,例如,它是容易提供一用户界面,允许用户来管理它的帐户。事实上,有差异之间的检查帐户,信用卡帐户。你将要管理的银行帐户现在可以在不同的数据库,或从其他遥远的银行帐户。一个将直接操作,另一个是使用一个网络协议的一些孩子来执行操作。

但从你的观点,所有你需要的是,合同是实现。CAN的工作和你的帐户。知识的具体细节上的帐户是不是你的问题做了手术。

这是一个漂亮的和尼斯,但重要的问题。你如何获得你的帐户吗?这是一个银行帐户信息的折扣是不同的从那些从本地帐户。的代码是不同的。和的方式创建它太。这两个帐户,你需要例如网络地址到服务器的其他银行。另一个可能需要数据库的ID。

每一次你需要有一个帐户,你可以明确recreate它,或获得它所有的实现细节。获得本地帐户或帐户约是非常不同的。

这一部分isolating复杂性的应用程序是一个很好的做法。它是一个较小的,符合subdivide复杂的任务,简单的酮。

给出的例子的一个会计应用,但事实上,我们可以更一般。创建对象和创建对象的查询是一个非常普通的问题在任何软件。因此,我们有良好的普通的方式做它在一maintainable干净时尚。

的代码的复杂性,管理学院获得一个特定的对象的创建,对象的知识隐藏在事实没有什么所谓的A或M是一个工厂。

(这是最好的工厂里发现隐藏的复杂性/对象)和接口(这是隐藏的复杂性,如果每个对象实现的)的Java程序员的工具使用管理软件的复杂性。


主要向用户公开接口的框架(而不是具体的实现)

既然您提到了bloch,我将用collections框架给出一个示例。可以看到Collections类有synchronizedX(..)unmodifiableX(..)singletonX(..)方法。这些是静态工厂方法,有很多,但它们只返回接口——ListMapSetSortedMap。在幕后,有许多您不需要知道的实现。

另一个例子(但不关注静态工厂)是JDBCAPI。几乎没有类——ConnectionStetementPreparedStatementResultSet等都是接口。这允许不同的数据库存在许多实现,而用户不需要做任何改变。(假设您必须在代码类中使用,如MySQLStatementOracleConnection等)