Design patterns 战略模式和状态模式的区别——以实例为例

Design patterns 战略模式和状态模式的区别——以实例为例,design-patterns,strategy-pattern,state-pattern,Design Patterns,Strategy Pattern,State Pattern,虽然同一主题有很多问题,但没有一个能完全消除我的困惑。因此,我试图用这两种模式给出一个示例及其解决方案 请告诉我我做得对还是错 课程: 之前条件:定义电压水平、燃油量、转子皮带条件 面包师:烘焙饼干的机器 LowSpeedBaker、HighSpeedBaker、MediumSpeedBaker:Baker的各种实现或状态 BakerStateFactory:它接受BeforeCondition并返回Baker的状态之一 实施1: 客户在条件之前创建,并从BakerStateFactory获

虽然同一主题有很多问题,但没有一个能完全消除我的困惑。因此,我试图用这两种模式给出一个示例及其解决方案

请告诉我我做得对还是错

课程:

  • 之前条件:定义电压水平、燃油量、转子皮带条件
  • 面包师:烘焙饼干的机器
  • LowSpeedBaker、HighSpeedBaker、MediumSpeedBaker:Baker的各种实现或状态
  • BakerStateFactory:它接受BeforeCondition并返回Baker的状态之一
实施1

客户在条件之前创建,并从BakerStateFactory获得合适的面包师。现在它调用baker的bake()

实施2

客户不关心机器如何工作。它只是将预处理条件传递给烘焙机。烘焙机本身根据之前的条件决定其状态

结论

第一个实现让客户机决定状态或必须注入的实现。机器是否能在那种条件下工作并不麻烦。这就是战略模式


在第二种实现中,机器本身可以决定其状态并相应地工作。如果需要,它还可以在进程之间自由更改其状态。这是状态模式。

基于您的示例场景:

当每个烘焙过程只使用一个算法时,您希望使用策略模式。有许多算法,但对于每个烘焙过程,您只使用其中一个。在这种情况下,你对面包师的策略可能是Cookie过程、Pizza过程。。。要烘焙比萨饼,请将面包师配置为使用比萨饼过程。然后将配料传递到bake()方法,比萨饼就会被发送到您的邮箱。继续这样做,因为在这里考虑返回类型可能会让人困惑,最终也会与工厂模式发生冲突。当您将面包师配置为使用CookieProcess时,面包师会烘焙它们,并将其中一半发送到您奶奶的邮箱

因此,这里有两种不同的策略:

  • 在220摄氏度下烘烤并发送至邮箱
  • 在180摄氏度下烘烤,然后寄给你和你奶奶
当您想要对烘焙过程进行更详细的建模时,您将使用状态模式。在这种情况下,您的状态可能是烘焙关闭、烘焙预热、烘焙预热完成、烘焙加热、烘焙冷却。当你开始为周五愚蠢的会议准备巧克力曲奇饼时,面包师正处于状态。虽然你很困,但你尝试把饼干放进去,但失败了,例外情况是说只有坏糖果商在没有预热的情况下烘烤饼干。因此,您调用Baker的enable()方法。内部状态变为烘焙预热,一段时间后变为烘焙预热完成。在这种状态转换中,可能会调用回调,例如,巨大的内置贝克贝尔。这提醒你把饼干放进去,开始烘焙加热阶段

所以在这里,我们只为奶奶烤饼干,但在许多州都有详细的款式。 请注意,您只能使用此面包师烘焙饼干,因为您只有一个烘焙算法

对于高级面包师,您可以组合这些模式。然后你就可以在同一个面包师里烤比萨饼和饼干了,还可以用特制的预热材料!当然,当面包师被配置用于比萨饼加工时,可以跳过预热阶段


你最终会遇到一个面包师,他可以使用不同的策略(比萨饼、饼干)。它们中的每一个都使用一些状态来完成。然而,战略决定了哪些状态可能被跳过或交换。(该策略可能有一个方法ispreferingforced())

基于您的示例场景:

当每个烘焙过程只使用一个算法时,您希望使用策略模式。有许多算法,但对于每个烘焙过程,您只使用其中一个。在这种情况下,你对面包师的策略可能是Cookie过程、Pizza过程。。。要烘焙比萨饼,请将面包师配置为使用比萨饼过程。然后将配料传递到bake()方法,比萨饼就会被发送到您的邮箱。继续这样做,因为在这里考虑返回类型可能会让人困惑,最终也会与工厂模式发生冲突。当您将面包师配置为使用CookieProcess时,面包师会烘焙它们,并将其中一半发送到您奶奶的邮箱

因此,这里有两种不同的策略:

  • 在220摄氏度下烘烤并发送至邮箱
  • 在180摄氏度下烘烤,然后寄给你和你奶奶
当您想要对烘焙过程进行更详细的建模时,您将使用状态模式。在这种情况下,您的状态可能是烘焙关闭、烘焙预热、烘焙预热完成、烘焙加热、烘焙冷却。当你开始为周五愚蠢的会议准备巧克力曲奇饼时,面包师正处于状态。虽然你很困,但你尝试把饼干放进去,但失败了,例外情况是说只有坏糖果商在没有预热的情况下烘烤饼干。因此,您调用Baker的enable()方法。内部状态变为烘焙预热,一段时间后变为烘焙预热完成。在这种状态转换中,可能会调用回调,例如,巨大的内置贝克贝尔。这提醒你把饼干放进去,开始烘焙加热阶段

所以在这里,我们只为奶奶烤饼干,但在许多州都有详细的款式。 请注意,您只能使用此面包师烘焙饼干,因为您只有一个烘焙算法

对于高级面包师,您可以组合这些模式。然后你可以在同一个烤箱里烤比萨饼和饼干