6

Controller receives a List of several Fruits from user. Controller needs to make juice from each of these fruits. One Juicer can make juice out of orange and grapefruit; another Juicer knows to make juice from apple, banana and papaya; and so on. Every Juicer can accept multiple Fruits in one go, it will process only the Fruits it's capable of and ignore other Fruits untouched. Kindly suggest an appropriate design for this problem. I have been considering the following options:

  1. Controller calls MasterJuicer.juice(List<Fruit> fruits). MasterJuicer in turn calls CitrusJuicer.juice(fruits) and PulpyJuicer.juice(fruits).
  2. Chain of Responsibility does not seem right. Order in which Juicers are called does not matter.
  3. Factory? Controller calls JuicerFactory.getJuicers(List<Fruit> fruits) to get a List<Juicer>. Controller then loops thru each Juicer and calls Juicer.juice(fruits). Is it common for a Factory to return a List of instances?
  4. Maintain a registry of Fruit vs. Juicer in a Map? Controller calls FruitsRegistry.getJuicer(Fruit fruit) for each fruit, then calls each Juicer in a loop.
4

5 回答 5

2

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

复合模式和访问者模式的组合可能对您有用。

  1. 复合模式将允许您构建一个了解其他榨汁机的MasterJuicer,并可以通过委托给榨汁机来启动“榨汁过程”。这可以处理问题的“结构”方面。
  2. 访问者模式允许每个榨汁机有一个统一的方法来与它们交互,而调用者(复合 MasterJuicer)无需关心它们如何协同工作。这处理“行为”方面。

您可以在每个访问者之间传递要处理的成分列表,以便他们可以与他们关心的水果进行交互。

如果您不想手动向 MasterJuicer 注册您的榨汁机,您可能希望通过某种服务发现变得聪明。Java 中的一种常用技术是使用注释和类路径扫描在运行时查找类并在启动时自动注册它们。有一些可用的库可以执行此操作,或者如果您已经在使用 Spring Framework,则可以使用其内置的扫描工具

于 2013-05-28T12:12:55.737 回答
2

In my opinion the pattern your looking for is the Chain of Responsibility

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

regards

于 2013-05-28T13:04:21.800 回答
2

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

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

于 2013-05-28T09:24:51.990 回答
1

这绝对是一个责任链。不知何故迭代Juicers并创造果汁,直到你没有水果。需要考虑的一些事情是需要混合产生的果汁(可能是混合模式Juice),以及如何安排优先级(如果两个榨汁机将榨葡萄柚,应该这样做吗?)。将所有这些逻辑封装在Juicer接口后面。

于 2013-05-28T13:21:03.697 回答
0

我建议你装饰器模式

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

希望能帮助到你!

于 2013-05-28T10:01:41.250 回答