如何在 UML 中显示接口和 类 之间的关系?

How to show relation between interfaces and classes in UML?

我有一些相关的接口和 classes 我想在 UML 中表示(抱歉关系,我不知道如何使用 StarUML 正确地做到这一点):

接口 ISMS 实现 IMessage 和 IStorable 的想法,而不是让 SMS class 直接实现这两个接口,旨在使项目更加模块化、可维护且更易于测试。

这是一个好的设计方法吗?如果是这样,这是在 UML Class 图中表示它们的好方法,还是有更好的方法来表示接口及其与 UML 中其他 interfaces/classes 的关系?

Is this a good approach for the design?

我认为是的,也是因为如果添加 MMS,它也可以实现 ISMS(可能会重命名该接口)。

对于 IEmail 不太清楚,除了简化 Email 和其他使用接口的 classes 有一个接口而不是两个

我很确定 Christophe 会对此说得更多:-)


is this a good way of representing them in an UML Class Diagram or is there a better way to represent an interface and its relationship with other interfaces/classes in UML?

表示class实现接口的关系是实现(用虚线画),你用了泛化, 所以还要添加 MMS :

... ISMS implementing IMessage and IStorable

警告这不是 实现 因为 ISMS 是一个接口,与 IEmail 相同,这就是为什么接口之间的继承是由泛化而不是实现来支持的。

除了 之外,我还有几点要说。

您的设计

将接口分解为 IStorableIMessage 乍一看似乎是 interface segregation principle.

的合理应用

将这两个接口组合成一个可重用的 ISMS 接口,而不是直接在具体的 SMS class 中实现它们,在这方面将使您的代码更易于维护,因为它很容易允许用替代实现替换 SMS 实现(如果您认为 SMS 功能可以是特定于平台的,这是有意义的)。

问题是 SMSemail 是否不能互换使用。但只有您可以回答这个问题:如果您的设计需要保持这些通信通道的不同(并且您的实际代码可能会在两个接口之间添加一些差异),那很好。但如果不是,允许这种互换性并用一个更通用的 INotification.

替换 ISMSIEmail 是有意义的

您的 UML 表示

首先,我想强调 Bruno 关于泛化(普通线)和 realization(虚线)之间的区别的评论。

也许我是老派,但我建议使用更传统的 interface 作为界面的圆圈,而不是使用带有关键字 [=19] 的 class 框=] 在接口名称上方。特别是如果你有属性和操作。

圆圈在我看来更适合界面的棒棒糖表示法。当您对接口本身没什么可说的,但想显示 class 实现(棒棒糖)或依赖于(套接字)的接口时,这非常实用。然后在另一个更详细的图表中定义接口细节。理论上您可以将这两个符号合并到同一个图表中,但我个人认为它的可读性较差,因此不建议这样做。