Java 设计模式选择困境

Java 设计模式选择困境,java,design-patterns,Java,Design Patterns,控制器从用户处接收几个水果的列表。控制器需要从这些水果中提取果汁。一台榨汁机可以把橙子和葡萄柚榨汁;另一个榨汁机知道用苹果、香蕉和木瓜榨汁;等等每台榨汁机都可以一次性榨取多个水果,它只处理自己能榨出的水果,而忽略其他未加工的水果。请针对此问题提出适当的设计方案。我一直在考虑以下选择: 控制器调用MasterJuice.juice(列出水果)masterjuice依次调用citrusjuice.juice(水果)和pullyjuice.juice(水果) 责任链似乎并不正确。榨汁机的调用顺序并不重

控制器从用户处接收几个水果的列表。控制器需要从这些水果中提取果汁。一台榨汁机可以把橙子和葡萄柚榨汁;另一个榨汁机知道用苹果、香蕉和木瓜榨汁;等等每台榨汁机都可以一次性榨取多个水果,它只处理自己能榨出的水果,而忽略其他未加工的水果。请针对此问题提出适当的设计方案。我一直在考虑以下选择:

  • 控制器调用MasterJuice.juice(列出水果)
    masterjuice
    依次调用
    citrusjuice.juice(水果)
    pullyjuice.juice(水果)
  • 责任链似乎并不正确。榨汁机的调用顺序并不重要
  • 工厂?控制器调用
    JuicerFactory.getJuicers(列出水果)
    以获得
    列表
    。然后控制器循环通过每个榨汁机并调用
    榨汁机。榨汁(水果)
    。工厂返回实例列表是否常见
  • 地图中维护水果与榨汁机的注册表
    ?控制器为每个水果调用
    FruitsRegistry.getJuice(水果)
    ,然后在循环中调用每个榨汁器

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

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

    我建议您

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


    希望有帮助

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

    一系列的规则和模式可能对您有用

  • 复合模式将允许您构建一个主榨汁机,该主榨汁机了解其他榨汁机,并可以通过授权给榨汁机来启动“榨汁过程”。这将处理问题的“结构”方面
  • 访问者模式允许每个榨汁机有一个统一的方法与它们交互,而无需调用者(复合主榨汁机)关心它们如何协同工作。这涉及到“行为”方面
  • 您可以在每位访客之间传递一份加工原料清单,以便他们能够与他们关心的水果互动


    如果您不想手动向MasterJuice注册榨汁机,您可能希望通过某种服务发现变得更聪明。Java中的一种常见技术是使用注释和类路径扫描在运行时查找类,并在启动时自动注册它们。有很多方法可以做到这一点,或者如果您已经在使用Spring框架,您可以使用它。

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


    这绝对是一个责任链。以某种方式迭代
    榨汁机
    ,并创建果汁,直到您用完水果。需要考虑的因素是混合果汁(可能是一个复合模式在代码>果汁<代码>),以及如何安排优先权(如果两个榨汁机将汁葡萄柚,该怎么办?)。将所有这些逻辑封装在
    榨汁机接口后面。

    如问题所述,“任务”可能需要多个榨汁机,具体取决于水果列表。在我的#3选项中,我并不是说工厂会退回所有榨汁机。相反,工厂将扫描水果并只返回加工水果所需的榨汁机。没有可以装饰的Base榨汁机(具有默认或通用功能)。请用代码扩展您的答案,以便我更好地理解。非常吸引人的答案。我将仔细考虑一下这些想法,看看它们对我真正的业务场景有何好处。感谢您提供指向类路径扫描工具的链接!