策略还是适配器模式?
Strategy or Adapter pattern?
我想为每个 Virtual Server Provider 创建一些 classes,例如:
- 数字海洋
- Linode
- 亚马逊 AWS
每个提供商都有自己的 PHP class(通过 composer)来使用他们的 API 接口,我想使用他们的 class 库,但我想确保我可以对每个提供者使用相同的方法。例如关闭 VPS:
- Linode API 方法:
powerOff()
- 数字海洋API方法:
haltServer()
而不是使用 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 执行相同功能的方法。这听起来很像 Abstraction 和 Delegation。
你可以通过定义一个名为Provider的公共接口来实现Abstraction,并使用shutdown
、connect
、retry
等。然后您可以为每种类型的提供程序(例如 AWSProvider
和 LinodeProvider
创建一个具体的提供程序 class 并实现 shutdown
、connect
和 retry
方法。然后,您可以通过在这些方法中调用提供者特定的 API 来使用 Delegation。例如在LinodeProvider
class.
的shutdown
方法里面调用powerOff
方法
如果您现在仔细查看您的设计,您将开始意识到它看起来像 Strategy 以及 Aadpter 模式。区分这两种模式的是 Abstraction 发挥作用的时间点。如果您决定在应用程序运行时通过 Factory 使用 Provider 实现,则您正在使用 Strategy 模式;但是,如果这个决定是在编译时做出的,那么您正在使用 Adapter 模式。除了模式的名称,您的 classes 看起来几乎相同。
这种方法的优点是您不仅确定了正确的模式,而且还通过使用 Command 等模式保护自己免于过度设计应用程序图案。
我想为每个 Virtual Server Provider 创建一些 classes,例如:
- 数字海洋
- Linode
- 亚马逊 AWS
每个提供商都有自己的 PHP class(通过 composer)来使用他们的 API 接口,我想使用他们的 class 库,但我想确保我可以对每个提供者使用相同的方法。例如关闭 VPS:
- Linode API 方法:
powerOff()
- 数字海洋API方法:
haltServer()
而不是使用 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 执行相同功能的方法。这听起来很像 Abstraction 和 Delegation。
你可以通过定义一个名为Provider的公共接口来实现Abstraction,并使用shutdown
、connect
、retry
等。然后您可以为每种类型的提供程序(例如 AWSProvider
和 LinodeProvider
创建一个具体的提供程序 class 并实现 shutdown
、connect
和 retry
方法。然后,您可以通过在这些方法中调用提供者特定的 API 来使用 Delegation。例如在LinodeProvider
class.
shutdown
方法里面调用powerOff
方法
如果您现在仔细查看您的设计,您将开始意识到它看起来像 Strategy 以及 Aadpter 模式。区分这两种模式的是 Abstraction 发挥作用的时间点。如果您决定在应用程序运行时通过 Factory 使用 Provider 实现,则您正在使用 Strategy 模式;但是,如果这个决定是在编译时做出的,那么您正在使用 Adapter 模式。除了模式的名称,您的 classes 看起来几乎相同。
这种方法的优点是您不仅确定了正确的模式,而且还通过使用 Command 等模式保护自己免于过度设计应用程序图案。