适配器模式如何解决依赖性?

时间:2019-02-22 11:28:14

标签: design-patterns adapter

我对适配器模式有疑问。我之所以要实现这种模式,是因为我有一个第三方库,并且不想依赖它。

但是,我不明白为什么在同一项目中创建IAdapter和Adapter会删除依赖项。

因为如果第三方库发生更改,则需要重新编译软件包,因此,也需要重新编译使用IAdapter的任何类。

IAdapter和适配器必须位于不同的软件包中吗?

2 个答案:

答案 0 :(得分:1)

衡量2个组件/类是否解耦的方法不仅仅是基于重新编译软件包的需要。它有多个维度。

  1. 能否在不引起IAdapter客户端代码更改的情况下,从客户端应用替换第三方库?
  2. 是否可以在不重建IAdapter客户端的情况下替换第三方库?
  3. 在某些情况下,是否可以在运行时替换第三方库而无需完全重新启动应用程序服务器?

根据您的需求,这是实现上述目标的方法。

  1. 您可以通过IAdapter实现ThirdParty1Adapter。如果您希望更换它,则可以实施ThirdParty2Adapter,该合同履行IAdapter的所有合同。您的IAdapter客户将不受影响。
  2. 您可以将实现类IAdapter捆绑在专用的jar中。客户端应用程序期望DI容器或应用程序服务器提供IAdapter的一种实现。这里有很多选择,但这里与技术无关。
  3. 您需要一个运行时,该运行时允许您动态添加jar并替换运行时加载的现有类中的依赖项。您可以使用OSGi中常见的类模式,该模式建议创建专用的API捆绑包,提供者捆绑包和使用者捆绑包。您可以在OSGi运行时中添加/替换提供者捆绑包,这些捆绑包可以在已经运行的类中进行拾取和注入。

答案 1 :(得分:0)

适配器不是神奇的。它将改编特定版本的类/库,以使其可用于您希望使用的API。
您必须比其他软件包更进一步,因为实际上,在这种情况下,适配器类(Adapter接口和Adapter实现)甚至不应包含在第三方库源代码中。
您希望将它们解耦,以使适配器依赖于适应类的特定版本和发行版,以使其集成稳定。