与不同版本的Web服务一起工作的设计模式?

5

我正在寻找一种设计模式来解决我所遇到的架构问题。

我使用了一些网络服务,它们有点相似但并不完全相同。对于每个新版本的网络服务,可能会有更多的可用方法,但在大部分情况下,它们基本相同。

我希望编写一个抽象层,无论我与哪个版本的网络服务通信,都能正常工作。显然,如果我使用的某个方法仅存在于较新的版本中,那么我将收到某种错误,但这没关系。我可以处理这些错误。

我想要这个抽象层的原因是为了避免我的应用程序和它通信的网络服务版本之间的紧密耦合。

在设计我这个抽象层时,有哪些设计模式可供选择呢?我看到有一种称为适配器(Adapter)的模式,还有一种称为桥接(Bridge)的模式。在这种情况下,这些是否都可以使用呢?任何帮助都将不胜感激!

编辑—为了清晰起见,这里展示了一个图示。

enter image description here

有时我想让我的应用程序与网络服务版本1通信,有时我想让它使用网络服务版本2。这取决于谁使用客户端应用程序。

客户端应用程序不应该真正知道或关心它正在与哪个版本进行通信。唯一的例外是,如果它使用了某些版本中可用的方法,我需要优雅地处理它们(告诉用户他们安装了旧版本的网络服务)。

2个回答

3

那将是一个工厂。你甚至可以使用内置的ChannelFactory或者自己想出一种方式。无论如何,工厂让你可以在不改变客户端协议的情况下更改实现。


2
我建议使用外观模式(FACADE pattern)。您可以通过以下链接了解更多信息。 http://javapapers.com/design-patterns/facade-design-pattern/ 外观模式旨在为客户端提供抽象和无缝交互层。它隐藏了所有内部复杂性,例如在您的情况下,客户端需要找到可以与之交互的正确版本的 web 服务。假设您有不同版本的 Web 服务,并且不同版本中输入的 JSON/XML 结构已更改,则 Facade 将接受客户端调用,将输入与不同版本的 Web 服务进行验证,然后调用正确的 Web 服务版本。如果没有外观层,则客户端将必须努力找到正确的 Web 服务版本,并且在到达正确的 Web 服务之前必须发送多个调用。

对我来说,外观设计模式似乎是将复杂的类隐藏在一个单一的类后面。我不知道如何将其应用到我的情况中。 - Frode Lillerud
更新了分辨率,并详细说明了外观模式如何在这里帮助您。 - Juned Ahsan
好的,我看到对于我的客户端应用程序使用的代码部分,我可以使用外观模式。但是在外观背后,我认为我需要使用另一种模式来负责创建与正确版本的Web服务连接。这可能是一个工厂模式?客户端必须能够基于输入参数(客户ID)使用所有不同的版本(而不仅仅是最新版本),因此我认为工厂模式将帮助我建立与正确Web服务的连接。 - Frode Lillerud
是的,你可以在Facade后面使用工厂模式或命令模式。 - Juned Ahsan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接