当前位置: 首页 > 知识库问答 >
问题:

如何在UML对象图和序列图中分别显示同一对象的引用类型和对象类型

鲍建业
2023-03-14

在上图实例中,可以通过ShowroomItem的引用或interface Vehicle的引用来引用myCar。相应地,客户端驱动程序/销售工程师将获得功能访问权。

我同意在实现阶段(例如Java),这里不需要类型标识,我们将把myCar当作自己使用的基类型(任一接口)的实例。

但在顺序图中(为了清楚起见),我无法指出myCar的驾驶员引用应该是Vehicle的,而SalesEngineer的引用应该是ShowRoomItem的。

package com.se.stackoverflow;

interface Vehicle {
    abstract void start();
    abstract void stop();
}

interface ShowroomItem {
    abstract void buy();
    abstract void sell();
}

class Car implements ShowroomItem, Vehicle {
    // **Car IS-A Vehicle and ShowroomItem BY-DEFINITION**
    // **and as per SOLID principle interface segregation**

    public void start() { System.out.println("Started");}
    public void stop() { System.out.println("Stopped");}
    public void sell() { System.out.println("Sold");}
    public void buy() { System.out.println("Baught");}
}

class SalesEngineer {
    private ShowroomItem item = null;
    public SalesEngineer(ShowroomItem item) { this.item = item;}
    public void doTransaction() {item.buy(); item.sell();}
}

class Driver {
    private Vehicle veh = null;
    public Driver(Vehicle veh) {this.veh = veh;}
    public boolean testDrive() {veh.start(); veh.stop(); return true;}
}

public class ShowroomOwner {
    public void makeDeal(Car carForDeal) {
        Driver driver = new Driver(carForDeal);
        SalesEngineer engineer = new SalesEngineer(carForDeal);
        if (driver.testDrive()) {
            engineer.doTransaction();
        }
    }

    public static void main(String[] args) {
        // simulates client as ShowroomOwner to save space
        new ShowroomOwner().makeDeal(new Car());
    }
}

共有1个答案

云锦
2023-03-14

您需要为序列图的每个生命线选择要显示的类型,因为UML只允许一个生命线。由于mycar是实现vehicleshowroomitemcar,您可以选择以下三种类型中的任何一种。

一旦选择了类型,UML就没有办法在同一图中提供该类型的替代视图。您可以使用mycar作为car来显示该场景。但是其他生命线必须遵守它们所知道的接口(如果没有其他使用依赖关系允许它们访问整个Car),并且由您来确保一致性。这可能容易出错,正如您在playmusic()中所演示的那样。

您可以通过图表中的一个或几个注释来解决您的问题,以纯文本方式提醒读者与接口相关的约束。但更好的方法是保持简单,在两个单独的图中显示salesengineercar之间的交互,以及drivercar之间的交互。这更接近于您的设计的现实,并促进了关注的合理分离。

如果一辆车不是一个陈列室项目,它既不应该从这样的类继承,也不应该实现这样的接口。因此,更喜欢组合而不是继承,例如:

    null
 类似资料:
  • 本文向大家介绍js对象类型,基本对象类型以及引用对象类型的区别?相关面试题,主要包含被问及js对象类型,基本对象类型以及引用对象类型的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 分为基本对象类型和引用对象类型 基本数据类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。基本数据类型有这六种:undefined、null、string、number、bool

  • 我使用带thymeleaf 3的Spring靴 我试着展示一个豆子 在我的控制器里我有 在我的车里 在我的位置 在我的胸腺碎片中 当我试图显示这个片段时,我得到 org.attoparser。ParseException:异常评估SpringEL表达式:“cities.id”由:org.springframework.expression.spel引起。SpelEvaluationExceptio

  • 问题内容: 我从“ Head First Java”学习“多态”,然后想到了这个概念。有人可以举例说明吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别? 问题答案: 我认为它们对“对象类型”和“引用类型”的使用不是标准化的,但这是我的解释。 考虑以下代码: 该 引用 是类型的。它引用的 对象 是类型。 因此,“引用类型”为,“对象类型”为。 造成这种混乱的原因是

  • 问题内容: Java中的以下代码在elipse上运行时,即使我们将其替换,也会提供相同的输出 与, 请注意,我们已经覆盖了方法。 输出为: 码: 请指出,用这两种方式创建子类对象有什么区别。并且访问方法和变量是否有任何区别?(我们的Java老师说,两种情况下访问方法和变量都不同) 同样,静态方法(例如main)会发生什么。艰难的我知道它是可继承的,但是有人可以在子类中突出它的行为吗? 问题答案:

  • 考虑下面的代码: 对于上面的代码,输出是:

  • 在Kotlin的类中,一个对象和一个同伴对象有什么区别? 它的“静态”(我是java方面的)生命周期可能有区别吗?