design-patterns - 适配器模式如何解决依赖关系?
问题描述
我对适配器模式有疑问。我正在实现这种模式,因为我有一个第三方库并且不想依赖它。
但是,我不明白为什么在同一个项目中创建 IAdapter 和 Adapter 会删除依赖项。
因为如果第三方库发生变化,包需要重新编译,所以任何使用IAdapter的类也需要重新编译。
IAdapter 和 Adapter 是否必须在不同的包中?
解决方案
衡量两个组件/类是否解耦不仅仅基于重新编译包的需要。它有多个维度。
- 您可以从客户端应用程序中替换第三方库而不导致客户端中的任何代码更改
IAdapter
吗? - 你可以在不需要重建客户端的情况下替换第三方库
IAdapter
吗? - 在某些情况下,您可以在运行时替换第三方库而无需完全重启应用服务器吗?
根据您的需求,以下是实现上述目标的方法。
- 您可以
IAdapter
通过ThirdParty1Adapter
. 如果你想替换它,你可以实现ThirdParty2Adapter
它来满足IAdapter
. 您的IAdapter
客户将不受影响。 - 您可以将实现类捆绑
IAdapter
在一个专用的 jar 中。客户端应用程序期望IAdapter
DI 容器或应用程序服务器提供其中一种实现。这里有一些选择,但这里只是与技术无关。 - 您需要一个运行时,允许您动态添加 jar 并替换运行时加载的现有类中的依赖项。您可以使用 OSGi 中常见的类模式,它建议创建专用的 API 包、提供者包和消费者包。您可以在 OSGi 运行时中添加/替换提供程序包,这些包可以被拾取并注入到已经运行的类中。
推荐阅读
- seo - how to set up SEO title and meta description in weebly online store products category pages
- pandas - 使用除午夜以外的其他开始时间分组日期
- python - How to subset a teradata table in Python
- symfony - Sulu CMS:如何配置搜索,同时考虑阻止内容
- cmake - Is it possible to use CMake find_package with a version with not only numbers?
- php - 教义实体管理器使用错误的连接
- wordpress - 哪个更快:通过 repo 加载图像,还是通过 WordPress 中的 ACF/媒体库加载?
- c - Can someone explain what does the interrupt "Trap" do in the micro controller
- android - How to boot a Qualcomm Snapdragon without HDMI
- python - Allowing access to USB port in Dockerfile?