虽然同一主题有很多问题,但没有一个问题完全消除了我的困惑。所以我试图用两种模式来举例和解决方案。
如果我正确地做了或者我做错了,请告诉我。
类:
实施1 :
客户创建 BeforeCondition ,并从 BakerStateFactory 获取相应的面包师。现在它调用面包师的bake()。
实施2 :
客户不打扰机器如何工作。它只是将BeforeCondition传递给Baker机器。贝克机器本身在BeforeCondition的基础上决定其状态。
结论
第一个实现允许客户端决定状态或必须注入的实现。它并不打扰机器是否可以在这种情况下实际工作。这是战略模式。
在第二个实现中,机器自己可以决定其状态并相应地工作。如果需要,它也可以在流程之间自由更改状态。这是状态模式。
答案 0 :(得分:1)
根据您的示例场景:
当您在每个烘焙过程中仅使用一种算法时,您希望使用策略模式。有许多算法,但对于每个烘焙过程,您只使用其中一个。在这种情况下,您对Baker的策略可能是 CookieProcess , PizzaProcess ,...要烘焙披萨,您可以配置 Baker 以使用< EM> PizzaProcess 。然后将成分传递给 bake()方法,并将Pizza发送到您的邮箱。顺其自然,因为在这里考虑返回类型可能会让人感到困惑,而且最终也会与工厂模式作斗争。当您配置 Baker 以使用 CookieProcess 时, Baker 会烘焙它们并将其中一半发送到您的奶奶邮箱。
所以这里有两种不同的策略:
如果您想更详细地模拟烘焙过程,您将使用状态模式。在这种情况下,您的状态可能是 BakerOff , BakerPreheating , BakerPreheatingDone , BakerHeating , BakerCooldown 。当您开始为周五的愚蠢会议准备巧克力饼干时, Baker 处于 BakerOff 状态。像你一样困,你尝试把饼干放进去,但是失败的例外是只有不好的糖果制作者在没有预热的情况下烘烤饼干。所以你调用Baker的enable()方法。内部状态更改为 BakerPreheating ,并在一段时间后更改为 BakerPreheatingDone 。在此状态转换时,可以调用回调,例如,庞大的BakerBell内置。这会提醒您实际放入cookie并启动 BakerHeating 阶段......
所以在这里我们只为奶奶烤饼干,但与许多州的详细讨论。 请注意,您只能使用此 Baker 烘焙Cookie,因为您只有一个烘焙算法。
对于高级 Baker ,您可以组合模式。然后你可以用同样的 Baker 烘焙比萨饼和饼干,加上花哨的预热东西!当然,当为 PizzaProcess 配置 Baker 时,可以跳过预热阶段。
你最终会遇到一个可以使用不同策略的面包师(比萨,饼干)。他们每个人都使用一些状态来完成。然而,该策略决定可以跳过或交换哪些州。 (也许策略有一个方法 isPreheatingForced())