Java 设计模式选择困境
控制器从用户处接收几个水果的列表。控制器需要从这些水果中提取果汁。一台榨汁机可以把橙子和葡萄柚榨汁;另一个榨汁机知道用苹果、香蕉和木瓜榨汁;等等每台榨汁机都可以一次性榨取多个水果,它只处理自己能榨出的水果,而忽略其他未加工的水果。请针对此问题提出适当的设计方案。我一直在考虑以下选择:Java 设计模式选择困境,java,design-patterns,Java,Design Patterns,控制器从用户处接收几个水果的列表。控制器需要从这些水果中提取果汁。一台榨汁机可以把橙子和葡萄柚榨汁;另一个榨汁机知道用苹果、香蕉和木瓜榨汁;等等每台榨汁机都可以一次性榨取多个水果,它只处理自己能榨出的水果,而忽略其他未加工的水果。请针对此问题提出适当的设计方案。我一直在考虑以下选择: 控制器调用MasterJuice.juice(列出水果)masterjuice依次调用citrusjuice.juice(水果)和pullyjuice.juice(水果) 责任链似乎并不正确。榨汁机的调用顺序并不重
masterjuice
依次调用citrusjuice.juice(水果)
和pullyjuice.juice(水果)
JuicerFactory.getJuicers(列出水果)
以获得列表
。然后控制器循环通过每个榨汁机并调用榨汁机。榨汁(水果)
。工厂返回实例列表是否常见地图中维护水果与榨汁机的注册表
?控制器为每个水果调用FruitsRegistry.getJuice(水果)
,然后在循环中调用每个榨汁器我认为第三种选择是最合适的,尽管工厂应负责返回任务所需的相应榨汁机-因此它不应返回所有榨汁机,而应返回任务所需的榨汁机。地图可以包含在其中,以帮助做出正确的选择 这种情况下,工厂包含选择正确榨汁机的逻辑,而不是控制器。我建议您 主要的想法是,你有一个基本的榨汁机,你添加它的其他功能
希望有帮助 工厂可以提供正确的榨汁机,但随后您的榨汁机处理逻辑将推送到控制器 一系列的规则和模式可能对您有用
如果您不想手动向MasterJuice注册榨汁机,您可能希望通过某种服务发现变得更聪明。Java中的一种常见技术是使用注释和类路径扫描在运行时查找类,并在启动时自动注册它们。有很多方法可以做到这一点,或者如果您已经在使用Spring框架,您可以使用它。在我看来,您要寻找的模式是责任链
这绝对是一个责任链。以某种方式迭代
榨汁机
,并创建果汁,直到您用完水果。需要考虑的因素是混合果汁(可能是一个复合模式在代码>果汁<代码>),以及如何安排优先权(如果两个榨汁机将汁葡萄柚,该怎么办?)。将所有这些逻辑封装在榨汁机接口后面。如问题所述,“任务”可能需要多个榨汁机,具体取决于水果列表。在我的#3选项中,我并不是说工厂会退回所有榨汁机。相反,工厂将扫描水果并只返回加工水果所需的榨汁机。没有可以装饰的Base榨汁机(具有默认或通用功能)。请用代码扩展您的答案,以便我更好地理解。非常吸引人的答案。我将仔细考虑一下这些想法,看看它们对我真正的业务场景有何好处。感谢您提供指向类路径扫描工具的链接!