设计模式选择困境

时间:2013-05-28 09:15:51

标签: java design-patterns

Controller从用户那里收到几个Fruit的List。控制器需要从这些水果制作果汁。一个榨汁机可以用橙子和葡萄柚制作果汁;另一个榨汁机知道用苹果,香蕉和木瓜制作果汁;等等。每个榨汁机都可以一次接受多种水果,它只能加工它能够的水果,而忽略其他未受影响的水果。请为此问题建议合适的设计。我一直在考虑以下选项:

  1. 控制器调用MasterJuicer.juice(List<Fruit> fruits)MasterJuicer依次调用CitrusJuicer.juice(fruits)PulpyJuicer.juice(fruits)
  2. 责任链似乎不对。调用榨汁机的顺序并不重要。
  3. 厂?控制器调用JuicerFactory.getJuicers(List<Fruit> fruits)以获得List<Juicer>。控制器然后循环通过每个榨汁机并调用Juicer.juice(fruits)。 Factory返回实例列表是否常见?
  4. Map维护水果与榨汁机的注册表?控制器为每个水果调用FruitsRegistry.getJuicer(Fruit fruit),然后循环调用每个榨汁机。

5 个答案:

答案 0 :(得分:2)

我认为第三种选择是最合适的,虽然工厂应该负责为任务返回适当的榨汁机 - 所以它不应该返回所有的榨汁机,而是你需要的榨汁机任务。地图可以包含在其中,以帮助正确选择。

这种情况工厂包含逻辑,用于选择正确的榨汁机,而不是控制器。

答案 1 :(得分:2)

工厂可以提供正确的榨汁机,但是您的榨汁机处理逻辑会被推送到您的控制器。

combinationcomposite模式的visitor可能对您有用。

  1. 复合模式将允许您构建一个知道其他榨汁机的 MasterJuicer ,并可以通过委托给榨汁机来启动“榨汁过程”。这可以处理问题的“结构”方面。
  2. 访客模式允许每个榨汁机有一个统一的方法与他们互动,而呼叫者(复合MasterJuicer)关心他们如何一起工作。这处理“行为”方面。
  3. 您可以传递每个访客之间的处理成分列表,以便他们可以与他们关注的成果进行互动。

    如果您不想手动向MasterJuicer注册榨汁机,您可能希望通过某种服务发现变得聪明。 Java中的一种常见技术是使用注释和类路径扫描在运行时查找类,并在启动时自动注册它们。有a few libraries可用,或者如果您已经在使用Spring Framework,则可以使用它built-in scanning tools

答案 2 :(得分:2)

在我看来,您寻找的模式是责任链

http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

问候

答案 3 :(得分:1)

这绝对是一连串的责任。以某种方式迭代Juicers并创造果汁,直到你失去果实。需要考虑的一些事情是需要混合生成的果汁(可能是Juice上的复合模式),以及如何安排优先级(如果两个榨汁机将榨汁葡萄柚,应该去做什么?)。将所有这些逻辑封装在Juicer接口后面。

答案 4 :(得分:0)

我建议你Decorator Pattern

主要的想法是你有一个基础榨汁机,你添加其他功能。

希望它有所帮助!