策略还是适配器模式?

Strategy or Adapter pattern?

我想为每个 Virtual Server Provider 创建一些 classes,例如:

每个提供商都有自己的 PHP class(通过 composer)来使用他们的 API 接口,我想使用他们的 class 库,但我想确保我可以对每个提供者使用相同的方法。例如关闭 VPS:

而不是使用 powerOff()haltServer() - 我想对我将创建的任何提供程序 class 使用 shutdown() 方法。我应该使用策略设计还是适配器模式?

这里最合适的设计模式既不是Strategy也不是Adaptor。 在我看来你应该检查 Command pattern.

此模式解决的问题与您提出的问题完全相同。它将提供您在案例中要求的单一方法 shutdown 并且通过依赖它可以调用依赖项公开的任何方法。

您问题的答案:Adapter,
Strategy 用于算法的一个或多个实现。

p.s。 Command 模式的建议也可以。

Should I use Strategy design or Adaptor pattern?

这是每个人(包括我自己)在设计应用程序时都会犯的 classic 错误。您应该 理想情况下 不要浏览可用设计模式列表并选择最适合您的问题的模式。相反,您应该提出一个初始 class 设计,然后尝试确定最能描述您的设计的模式。这可以保护您免于 过度设计,即创建不需要的不必要组件。随着时间的推移,您很快就会拥有实际使用过的设计模式词汇表,而不是尝试使用特定设计模式的应用程序。

撇开设计模式不谈,您正在寻找的似乎是一种提供通用接口以使用不同底层 libraries/approaches 执行相同功能的方法。这听起来很像 AbstractionDelegation

你可以通过定义一个名为Provider的公共接口来实现Abstraction,并使用shutdownconnectretry 等。然后您可以为每种类型的提供程序(例如 AWSProviderLinodeProvider 创建一个具体的提供程序 class 并实现 shutdownconnectretry 方法。然后,您可以通过在这些方法中调用提供者特定的 API 来使用 Delegation。例如在LinodeProviderclass.

shutdown方法里面调用powerOff方法

如果您现在仔细查看您的设计,您将开始意识到它看起来像 Strategy 以及 Aadpter 模式。区分这两种模式的是 Abstraction 发挥作用的时间点。如果您决定在应用程序运行时通过 Factory 使用 Provider 实现,则您正在使用 Strategy 模式;但是,如果这个决定是在编译时做出的,那么您正在使用 Adapter 模式。除了模式的名称,您的 classes 看起来几乎相同。

这种方法的优点是您不仅确定了正确的模式,而且还通过使用 Command 等模式保护自己免于过度设计应用程序图案。