Controller从用户那里收到几个Fruit的List。控制器需要从这些水果制作果汁。一个榨汁机可以用橙子和葡萄柚制作果汁;另一个榨汁机知道用苹果,香蕉和木瓜制作果汁;等等。每个榨汁机都可以一次接受多种水果,它只能加工它能够的水果,而忽略其他未受影响的水果。请为此问题建议合适的设计。我一直在考虑以下选项:
MasterJuicer.juice(List<Fruit> fruits)
。 MasterJuicer
依次调用CitrusJuicer.juice(fruits)
和PulpyJuicer.juice(fruits)
。JuicerFactory.getJuicers(List<Fruit> fruits)
以获得List<Juicer>
。控制器然后循环通过每个榨汁机并调用Juicer.juice(fruits)
。 Factory返回实例列表是否常见?Map
维护水果与榨汁机的注册表?控制器为每个水果调用FruitsRegistry.getJuicer(Fruit fruit)
,然后循环调用每个榨汁机。答案 0 :(得分:2)
我认为第三种选择是最合适的,虽然工厂应该负责为任务返回适当的榨汁机 - 所以它不应该返回所有的榨汁机,而是你需要的榨汁机任务。地图可以包含在其中,以帮助正确选择。
这种情况工厂包含逻辑,用于选择正确的榨汁机,而不是控制器。
答案 1 :(得分:2)
工厂可以提供正确的榨汁机,但是您的榨汁机处理逻辑会被推送到您的控制器。
combination和composite模式的visitor可能对您有用。
您可以传递每个访客之间的处理成分列表,以便他们可以与他们关注的成果进行互动。
如果您不想手动向MasterJuicer注册榨汁机,您可能希望通过某种服务发现变得聪明。 Java中的一种常见技术是使用注释和类路径扫描在运行时查找类,并在启动时自动注册它们。有a few libraries可用,或者如果您已经在使用Spring Framework,则可以使用它built-in scanning tools。
答案 2 :(得分:2)
答案 3 :(得分:1)
这绝对是一连串的责任。以某种方式迭代Juicers
并创造果汁,直到你失去果实。需要考虑的一些事情是需要混合生成的果汁(可能是Juice
上的复合模式),以及如何安排优先级(如果两个榨汁机将榨汁葡萄柚,应该去做什么?)。将所有这些逻辑封装在Juicer
接口后面。
答案 4 :(得分:0)