我想创建每个Virtual Server Provider的一些类,例如:
每个Provider都有自己的PHP类(通过编辑器)来使用他们的API接口,我想使用他们的类库,但我想确保我可以为每个提供者使用相同的方法。例如关闭VPS:
powerOff()
haltServer()
而不是使用powerOff()
和haltServer()
- 我想对我将创建的任何提供程序类使用shutdown()
方法。我应该使用策略设计还是适配器模式?
答案 0 :(得分:10)
我应该使用策略设计还是适配器模式?
这是每个人在设计应用程序(包括我自己)时所犯的经典错误。您应该理想不浏览可用设计模式列表并选择最符合您问题的模式。相反,您应该提出初始类设计,然后尝试确定最能描述您设计的模式。这可以保护您免受过度设计,即创建您不需要的不必要的组件。随着时间的推移,您很快就会拥有实际使用的设计模式词汇,而不是尝试使用特定设计模式的应用程序。
抛开设计模式,看起来你正在寻找的是一种提供使用不同底层库/方法执行相同功能的通用接口的方法。这听起来很像 Abstraction 和 Delegation 。
您可以通过使用标准操作方法(例如shutdown
,connect
,{{1)定义名为 Provider 的公共接口来实现抽象然后,您可以为每种类型的提供程序创建一个具体的提供程序类,例如retry
和AWSProvider
,并实现LinodeProvider
,shutdown
和{{1} } 方法。然后,通过在这些方法中调用提供程序特定的API,使用委派。例如,在connect
类的retry
方法中调用powerOff
方法。
如果您现在仔细研究您的设计,您将开始意识到它看起来像策略以及 Aadpter 模式。这两种模式的区别在于 Abstraction 发挥作用的时间点。如果您决定在应用程序的运行时通过 Factory 使用 Provider 实现,那么您正在使用策略模式;但是,如果在编译时做出此决定,则表明您使用的是 Adapter 模式。除了模式的名称,你的类看起来几乎一样。
这种方法的优点是您不仅可以识别正确的模式,还可以通过使用 Command 模式等模式来保护自己免于过度设计应用程序。
答案 1 :(得分:1)
答案 2 :(得分:0)
此处最佳拟合设计模式既不是<style name=fullscreendialog/>
也不是Strategy
。
在我看来,你应该检查Command pattern。
此模式解决了您所问的完全相同的问题。它会根据您在Adaptor
中提出的问题提供单一方法,并且通过依赖它可以调用依赖项公开的任何方法。