策略或适配器模式?

时间:2017-01-09 22:33:48

标签: php design-patterns adapter strategy-pattern

我想创建每个Virtual Server Provider的一些类,例如:

  • Digital Ocean
  • 的Linode
  • 亚马逊AWS

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

  • Linode API方法:powerOff()
  • Digital Ocean API方法:haltServer()

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

3 个答案:

答案 0 :(得分:10)

  

我应该使用策略设计还是适配器模式?

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

抛开设计模式,看起来你正在寻找的是一种提供使用不同底层库/方法执行相同功能的通用接口的方法。这听起来很像 Abstraction Delegation

您可以通过使用标准操作方法(例如shutdownconnect,{{1)定义名为 Provider 的公共接口来实现抽象然后,您可以为每种类型的提供程序创建一个具体的提供程序类,例如retryAWSProvider,并实现LinodeProvidershutdown和{{1} } 方法。然后,通过在这些方法中调用提供程序特定的API,使用委派。例如,在connect类的retry方法中调用powerOff方法。

如果您现在仔细研究您的设计,您将开始意识到它看起来像策略以及 Aadpter 模式。这两种模式的区别在于 Abstraction 发挥作用的时间点。如果您决定在应用程序的运行时通过 Factory 使用 Provider 实现,那么您正在使用策略模式;但是,如果在编译时做出此决定,则表明您使用的是 Adapter 模式。除了模式的名称,你的类看起来几乎一样。

这种方法的优点是您不仅可以识别正确的模式,还可以通过使用 Command 模式等模式来保护自己免于过度设计应用程序。

答案 1 :(得分:1)

回答你的问题:Adapter
当你可以有一个或多个algortihm的实现时,会使用Strategy

P.S。使用Command模式的建议也可以。

答案 2 :(得分:0)

此处最佳拟合设计模式既不是<style name=fullscreendialog/> 也不是Strategy。 在我看来,你应该检查Command pattern

此模式解决了您所问的完全相同的问题。它会根据您在Adaptor中提出的问题提供单一方法,并且通过依赖它可以调用依赖项公开的任何方法。