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

How Adapter Pattern Resolve Dependencies?

我对适配器模式有疑问。我正在实施此模式,因为我有第三方库并且不想依赖它。

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

因为如果第三方库发生变化,需要重新编译包,所以使用IAdapter的class也需要重新编译。

IAdapter 和 Adapter 是否必须在不同的包中?

适配器并不神奇。它将调整 class/library 的特定版本,使其可用于您希望使用的 API。
你必须比不同的包走得更远,因为在你的情况下,适配器 classes(适配器接口和适配器实现)甚至不应该包含在第三方库源代码中。
您希望将它们解耦以使适配器依赖于特定的已发布版本的改编 class 以使其集成稳定。

衡量2components/classes是否解耦,并不仅仅基于需要重新编译包。它有多个维度。

  1. 您能否从客户端应用程序替换第三方库而不导致 IAdapter 客户端中的任何代码更改?
  2. 能不能不用重建IAdapter的客户端就替换第三方库?
  3. 在某些情况下,您可以在运行时替换第三方库而无需完全重启应用程序服务器吗?

根据您的需要,以下是实现上述目标的方法。

  1. 您可以让 IAdapterThirdParty1Adapter 实现。如果你想替换它,你可以实现 ThirdParty2Adapter 来满足 IAdapter 的所有契约。您的 IAdapter 客户将不受影响。
  2. 您可以将 IAdapter 的 class 实现捆绑在专用 jar 中。客户端应用程序期望 IAdapter 的实现之一由 DI 容器或应用程序服务器提供。这里有选项,但这里只是技术不可知论者。
  3. 您需要一个允许您动态添加 jar 并替换运行时加载的现有 classes 中的依赖项的运行时。您可以使用 OSGi 中常见的 class 模式,它建议创建专用的 API 包、提供者包和消费者包。您可以在您的 OSGi 运行时中 add/replace 提供程序捆绑包,它们可以在 运行 classes.
  4. 中获取和注入