UML/OOP: 在不同 类 中使用类似方法的接口

UML/OOP: Using an interface for similar methods in different classes

假设我有两个不同的 classes 需要打印不同的东西:

OrderManager 想要打印订单历史记录,而 MenuManager 想要打印菜单。由于两者都想做类似的功能(但实际实现不同),是否建议使用这样的接口?问题是与“printOrderHistory”相比,函数“print”的定义不是很明确且不言自明,我只能使用接口中定义的确切名称来实现该方法。

是否有解决方法,或者我是否错误地使用了界面概念?事实上,似乎没有什么能阻止我为每个没有接口的 class 定义自己的打印函数...

这就是接口的用途!它定义了一组操作,任何实现了这个接口的class都需要实现这些操作。这允许引用 Printable 对象并调用 print(),知道它将执行与该对象相关的操作。

因此,您的 UML 图是模棱两可的:正如 OrderManager 意识到(在 java、“实现”中)Printable 它应该有自己的 print()。 UML和Java中有三种解决方案:

  1. 按照您的图表所承诺的界面,将 printOrderHistory() 重命名为 print()。如果只有一种有意义的方式来打印和订购管理器,并且没有其他限制,这是有意义的。

  2. print() 操作(在 java,“方法”中)添加到 OrderManager(),它只是将调用转发到 printOrderHistory()。但这看起来过于复杂。仅当订单管理器真的可以打印时才合理,并且 print() 会添加一些相关功能,例如根据某些因素选择正确的打印功能。

  3. 使用 adapter pattern 并保持 OrderManager 干净,使用中间对象处理脏东西。如果 OrderManager 的打印函数的名称受到限制,或者如果有不同的打印函数用于不同的目的,这尤其有意义。这是最灵活的方法

这里是解决方案 3 的可能图表:

接口的想法是有一个合同来完成。这意味着,在构建实现​​时,您必须使用接口中定义的方法名称和参数。

根据我的个人经验,在 类 上强加一个接口总是一个坏主意,它们并不相似,因为它们确实有不同的用途。虽然您可以在 类 中使用 print(),但只有当它们在您的代码中可交换时才有意义。