Uml Class 图构造
Uml Class Diagram Construction
使用以下信息制作 class 图有点麻烦:
- 一家服务公司为其客户提供服务。
- 客户可以分为两种类型:公司住宅
- 住宅客户只能购买住宅服务,公司客户可以购买公司和住宅服务。
- 住宅服务可以预付费或后付费,公司服务总是后付费
- 预付费服务可由客户续订,后付费服务自动续订
- 3G 和 ADSl 服务出售给住宅和企业客户,iFly 服务仅出售给住宅。
这是我做的UML图,可以吗?
因为你必须学习做UML,我会让你画出模式。但是这里有一些提示可以开始您的 class 图:
- "服务公司为其客户提供服务" =>这只是一般框架。我们需要一个
Customer
和一个 Service
class
- "客户可以是两种类型:公司住宅" => 你需要 classes
Residential
和 Corporate
与 Customer
具有泛化关系。
- "住宅客户只能购买住宅服务,公司客户可以购买公司和住宅服务" =>您需要
ResidentialService
和 CorporateService
class 与 Service
具有泛化关系。此外,您还可以绘制所提到的关系。
- "住宅服务可以预付费或后付费,公司服务总是后付费" => 有几种方法可以做到这一点。例如:您可以 class
PaymendMode
和 Service
的关系。然后在 link 上添加注释,并在 { }
之间写入约束 - 另一种方法是预见 classes PrepaidProduct
,PostpaidProduct
继承自 PaidProduct
并绘制强制或可选关系(使用基数)
- "预付费服务可以由客户续订,后付费服务自动续订" =>,有几种方法可以做到这一点。一种方法是向服务添加方法
renewal()
并使用注释阐明特殊情况 - 或者,如果您选择具有关系的支付模式层次结构,则可以建立从 ResidentialService
到PrepaidProduct
和从 BusinessService
到 PaidProduct
,并在父级上添加接口方法。
- "3G 和 ADSl 服务出售给住宅和企业客户,iFly 服务仅出售给住宅" => 这是一个陷阱: 3G、ADSL、iFly是对象,不是classes,所以在class图上没有关系。另一方面,这可能暗示您需要与
Service
相关的 class Product
。
编辑:对您的图表进行了一些更正
您的图表应该以相反的方式表示继承:
用于显示多值属性的数组表示法:
实际上与具有基数的关系相同。更喜欢关系:
其余的,我觉得逻辑没问题。除了不同服务中的 prepaid/postpaid:基数应为 0..1(可选)(或 1 为强制)。
最后的评论:关于 prepaid/postpaid:尚不清楚该服务是否仅指示接受了哪些付款方式(独立于客户),或者此属性是否是客户特定的。如果是后者,则应在客户和相关服务之间使用关联 class(请参阅 here)
使用以下信息制作 class 图有点麻烦:
- 一家服务公司为其客户提供服务。
- 客户可以分为两种类型:公司住宅
- 住宅客户只能购买住宅服务,公司客户可以购买公司和住宅服务。
- 住宅服务可以预付费或后付费,公司服务总是后付费
- 预付费服务可由客户续订,后付费服务自动续订
- 3G 和 ADSl 服务出售给住宅和企业客户,iFly 服务仅出售给住宅。
这是我做的UML图,可以吗?
因为你必须学习做UML,我会让你画出模式。但是这里有一些提示可以开始您的 class 图:
- "服务公司为其客户提供服务" =>这只是一般框架。我们需要一个
Customer
和一个Service
class - "客户可以是两种类型:公司住宅" => 你需要 classes
Residential
和Corporate
与Customer
具有泛化关系。 - "住宅客户只能购买住宅服务,公司客户可以购买公司和住宅服务" =>您需要
ResidentialService
和CorporateService
class 与Service
具有泛化关系。此外,您还可以绘制所提到的关系。 - "住宅服务可以预付费或后付费,公司服务总是后付费" => 有几种方法可以做到这一点。例如:您可以 class
PaymendMode
和Service
的关系。然后在 link 上添加注释,并在{ }
之间写入约束 - 另一种方法是预见 classesPrepaidProduct
,PostpaidProduct
继承自PaidProduct
并绘制强制或可选关系(使用基数) - "预付费服务可以由客户续订,后付费服务自动续订" =>,有几种方法可以做到这一点。一种方法是向服务添加方法
renewal()
并使用注释阐明特殊情况 - 或者,如果您选择具有关系的支付模式层次结构,则可以建立从ResidentialService
到PrepaidProduct
和从BusinessService
到PaidProduct
,并在父级上添加接口方法。 - "3G 和 ADSl 服务出售给住宅和企业客户,iFly 服务仅出售给住宅" => 这是一个陷阱: 3G、ADSL、iFly是对象,不是classes,所以在class图上没有关系。另一方面,这可能暗示您需要与
Service
相关的 classProduct
。
编辑:对您的图表进行了一些更正
您的图表应该以相反的方式表示继承:
用于显示多值属性的数组表示法:
实际上与具有基数的关系相同。更喜欢关系:
其余的,我觉得逻辑没问题。除了不同服务中的 prepaid/postpaid:基数应为 0..1(可选)(或 1 为强制)。
最后的评论:关于 prepaid/postpaid:尚不清楚该服务是否仅指示接受了哪些付款方式(独立于客户),或者此属性是否是客户特定的。如果是后者,则应在客户和相关服务之间使用关联 class(请参阅 here)