设计模式选择困境

Som*_*omu 6 java design-patterns

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

  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)每个水果,然后循环调用每个榨汁机.

sea*_*ges 2

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

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

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

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

如果您不想手动向 MasterJuicer 注册榨汁机,您可能需要巧妙地进行某种服务发现。Java 中的一种常见技术是使用注释和类路径扫描在运行时查找类并在启动时自动注册它们。有一些库可以执行此操作,或者如果您已经在使用 Spring 框架,则可以使用其内置扫描工具