适配器模式如何解决依赖关系?
How Adapter Pattern Resolve Dependencies?
我对适配器模式有疑问。我正在实施此模式,因为我有第三方库并且不想依赖它。
但是,我不明白为什么在同一个项目中创建 IAdapter 和 Adapter 会删除依赖项。
因为如果第三方库发生变化,需要重新编译包,所以使用IAdapter的class也需要重新编译。
IAdapter 和 Adapter 是否必须在不同的包中?
适配器并不神奇。它将调整 class/library 的特定版本,使其可用于您希望使用的 API。
你必须比不同的包走得更远,因为在你的情况下,适配器 classes(适配器接口和适配器实现)甚至不应该包含在第三方库源代码中。
您希望将它们解耦以使适配器依赖于特定的已发布版本的改编 class 以使其集成稳定。
衡量2components/classes是否解耦,并不仅仅基于需要重新编译包。它有多个维度。
- 您能否从客户端应用程序替换第三方库而不导致
IAdapter
客户端中的任何代码更改?
- 能不能不用重建
IAdapter
的客户端就替换第三方库?
- 在某些情况下,您可以在运行时替换第三方库而无需完全重启应用程序服务器吗?
根据您的需要,以下是实现上述目标的方法。
- 您可以让
IAdapter
由 ThirdParty1Adapter
实现。如果你想替换它,你可以实现 ThirdParty2Adapter
来满足 IAdapter
的所有契约。您的 IAdapter
客户将不受影响。
- 您可以将
IAdapter
的 class 实现捆绑在专用 jar 中。客户端应用程序期望 IAdapter
的实现之一由 DI 容器或应用程序服务器提供。这里有选项,但这里只是技术不可知论者。
- 您需要一个允许您动态添加 jar 并替换运行时加载的现有 classes 中的依赖项的运行时。您可以使用 OSGi 中常见的 class 模式,它建议创建专用的 API 包、提供者包和消费者包。您可以在您的 OSGi 运行时中 add/replace 提供程序捆绑包,它们可以在 运行 classes.
中获取和注入
我对适配器模式有疑问。我正在实施此模式,因为我有第三方库并且不想依赖它。
但是,我不明白为什么在同一个项目中创建 IAdapter 和 Adapter 会删除依赖项。
因为如果第三方库发生变化,需要重新编译包,所以使用IAdapter的class也需要重新编译。
IAdapter 和 Adapter 是否必须在不同的包中?
适配器并不神奇。它将调整 class/library 的特定版本,使其可用于您希望使用的 API。
你必须比不同的包走得更远,因为在你的情况下,适配器 classes(适配器接口和适配器实现)甚至不应该包含在第三方库源代码中。
您希望将它们解耦以使适配器依赖于特定的已发布版本的改编 class 以使其集成稳定。
衡量2components/classes是否解耦,并不仅仅基于需要重新编译包。它有多个维度。
- 您能否从客户端应用程序替换第三方库而不导致
IAdapter
客户端中的任何代码更改? - 能不能不用重建
IAdapter
的客户端就替换第三方库? - 在某些情况下,您可以在运行时替换第三方库而无需完全重启应用程序服务器吗?
根据您的需要,以下是实现上述目标的方法。
- 您可以让
IAdapter
由ThirdParty1Adapter
实现。如果你想替换它,你可以实现ThirdParty2Adapter
来满足IAdapter
的所有契约。您的IAdapter
客户将不受影响。 - 您可以将
IAdapter
的 class 实现捆绑在专用 jar 中。客户端应用程序期望IAdapter
的实现之一由 DI 容器或应用程序服务器提供。这里有选项,但这里只是技术不可知论者。 - 您需要一个允许您动态添加 jar 并替换运行时加载的现有 classes 中的依赖项的运行时。您可以使用 OSGi 中常见的 class 模式,它建议创建专用的 API 包、提供者包和消费者包。您可以在您的 OSGi 运行时中 add/replace 提供程序捆绑包,它们可以在 运行 classes. 中获取和注入