客户和产品列表之间的 UML 关系(Java Supermaket 软件)

UML Relationship between Customer and Product List (Java Supermaket Software)

我正在尝试创建一个超市软件,允许客户或所有者通过 Java 中基于 swing 的 GUI 登录并使用我的系统。当客户登录后,他们可以查看产品。当所有者登录后,他们可以查看产品并添加新产品。

我想要 Customer class 中的方法:ViewProducts()
Owner class 中的方法:ViewProducts()AddProducts().
这些方法是否错误,因为它们不是特定于 customer/owner(它们与产品相关)。

我的关系是 Customer class 与 ProductList 一对一的关系,Owner 与 [=17= 一对一的关系],这两个 classes 可以用他们自己的方式操作数据。我做错了吗?

这种方式没有意义,因为 CustomerOwner 不能有与其无关的属性,例如 ProductList.

您首先需要考虑的是 IS-A 与 HAS-A。如果你的 class 是一个特定的东西,它应该是超级 class 的 child。如果它有东西,那么它就是一个组合。如果我正在设计这个,我会让 productList 成为一个 class,然后让商店员工作为超级 class,所有者和工人作为 sub-classes,两者都将产品列表作为一个组合。

你应该始终致力于捕捉现实中存在的东西。 Customer 实例 ProductList 没有 一对一的关系,因为 ProductList 可以被多个 Customer 查看],并且 Customer 绝不会 拥有 该列表。

大概比较接近实际的是:

  • Supermarket个人管理一个Inventory个人
  • 每个 Inventory 个人:
    • 一个Supermarket个人管理
    • 包括Inventory Item个人
  • 每个 Inventory Item 个人
    • 一个Inventory个人组成
    • 描述Product个人
  • 每个 Product 个人
    • 描述为一个Inventory Item个人
    • 位于Physical Location个人
  • 每个 User Account 个人
    • 识别个人
    • 出场角色个人
  • 每个角色个体提供能力个体

在现实生活中,人们扮演着角色。这些角色可能是“客户”、“医生”或“警察”。每个人 Role 都有一组可以执行的功能。在 OO 系统中,每个个体 Role 都可以使用操作来实现其功能,例如 purchaseProduct()prescribeMedication()writeMovingViolation().

有多种方法可以在 OO 系统中表示这些角色和功能。在一种方法中,Rolecustomer 实例可能被配置为允许访问 queryInventory()purchaseProduct()SupermarketInventoryItem 的操作class分别是。 Role 1owner 实例可能被配置为允许访问 [=16= 上的 addInventoryItem()removeInventoryItem() 操作] class.

这是一个 UML 模型的例子:

在另一种方法中,您可以创建 Role class 的单例子 class,称为 CustomerRoleOwnerRole,然后让每个这些 subclasses 调用操作。您可以将 viewProducts()addProducts() 操作放入这些单例中。


1考虑称这个角色为“经理”,这样超市的老板就可以雇佣其他人来做这项工作了。