1

尽管关于同一个主题有很多问题,但没有一个能完全消除我的困惑。所以我试图用这两种模式举一个例子及其解决方案。

请告诉我我做对了还是做错了什么。

课程:

  • BeforeCondition : 定义电压等级、燃料量、转子皮带状况
  • Baker : 烘烤饼干的机器
  • LowSpeedBaker、HighSpeedBaker、MediumSpeedBaker:Baker 的各种实现或状态。
  • BakerStateFactory:它接受 BeforeCondtion 并返回 Baker 的状态之一。

实施1

客户端创建BeforeCondition并从BakerStateFactory获取适当的面包师。现在它调用面包师的 bake()。

实施2

客户不关心机器如何工作。它只是将 BeforeCondition 传递给 Baker 机器。Baker 机器本身根据 BeforeCondition 决定其状态。

结论

第一个实现让客户端决定状态或必须注入什么实现。机器是否可以在该条件下实际工作并不关心。这是策略模式。

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

4

1 回答 1

1

根据您的示例场景:

当您在每个烘焙过程中仅使用一种算法时,您想使用策略模式。有许多算法,但对于每个烘焙过程,您只使用其中一种。在这种情况下,您对 Baker 的策略可能是CookieProcessPizzaProcess、...。要烘烤披萨,您需要将Baker配置为使用PizzaProcess。然后你将配料传递给bake()方法,Pizza 就会发送到你的邮箱。这样做,因为在这里考虑返回类型可能会令人困惑,并且您最终也会与工厂模式作斗争。当您将Baker配置为使用CookieProcess时,Baker把它们烤好,然后把一半送到你奶奶的邮箱。

所以这里有两种不同的策略:

  • 220摄氏度烘烤并发送到您的邮箱,
  • 180度烤,送给你和你奶奶

当您想要更详细地对烘焙过程进行建模时,您将使用状态模式。在这种情况下,您的状态可能是BakerOffBakerPreheatingBakerPreheatDoneBakerHeatingBakerCooldown。当您开始为星期五的愚蠢会议准备巧克力曲奇时,贝克处于BakerOff状态。尽管你很困,但你试图把饼干放进去,但失败了,只有一个例外,说只有坏糖果商在没有预热的情况下烤饼干。所以你调用 Baker 的 enable() 方法。内部状态变为BakerPreheat并在一段时间后变为贝克预热完成。在这种状态转换中,可能会调用回调,例如 BakerBell 中内置的巨大。这提醒您实际放入饼干并开始贝克加热阶段......

所以在这里我们只为奶奶烤饼干,但对许多州都有详细的热情。请注意,您只能使用此Baker烘烤饼干,因为您只有一种烘烤算法。

对于高级面包师,您可以组合模式。然后,您可以在同一个Baker中使用精美的预热材料烘烤比萨饼和饼干!当然,当为PizzaProcess配置Baker时,可以跳过预热阶段。

您最终会得到一个可以使用不同策略(比萨饼、饼干)的面包师。他们每个人都使用一些状态来完成。然而,策略决定哪些状态可以被跳过或交换。(也许该策略有一个方法isPreheathForced()

于 2013-05-12T20:26:52.983 回答