【问题标题】:UML class diagram composition with class hierarchies具有类层次结构的 UML 类图组合
【发布时间】:2012-07-13 23:23:27
【问题描述】:

我想知道我是否可以像我所做的那样对下面两个类层次结构之间的关系进行建模:

代表此含义的代码如下:

public abstract class Car
{
    protected Engine engine;  
}
public class StreetCar extends Car
{
     public StreetCar()
     {
          engine = new StreetEngine();
     }
}

...类似地,对于 OffroadCar 类,它会执行类似engine = new OffroadEngine() 的操作。我没有包含任何关于加速()方法的内容,它不相关。

我只想知道合成是否正确建模,或者添加那么多合成箭头是否多余甚至错误。

【问题讨论】:

  • 这闻起来像家庭作业。如果是,请标记为这样。

标签: java uml composition class-diagram


【解决方案1】:

在回答问题之前,这是其中一种情况,将层次关系与组合关系分开是一个好主意,就好像它们在不同类型的图表中一样。

注意:我在图中添加了 Engine,作为“受保护”和“类”前缀,以避免混淆。

(1)组成图

“CarClass”的一个对象,它由一个“EngineClass”的单个对象组成。

..............................................................................
..+-------------------------------------+........+-------------------------+..
..|           <<abstract>>              |........|      <<abstract>>       |..
..|             CarClass                |........|       EngineClass       |..
..+-------------------------------------+........+-------------------------+..
..| [#] Engine: EngineClass             |<*>-----+ [+] startEngine(): void |..
..+-------------------------------------+........+-------------------------+..
..| [+] acelerate(): void <<virtual>>   |.....................................
..+-------------------------------------+.....................................
..............................................................................

(2.1) 继承图

在某些情况下,“CarClass”的对象可能有子类。

...........................................
..+-------------------------------------+..
..|           <<abstract>>              |..
..|             CarClass                |..
..+-------------------------------------+..
..| [#] Engine: EngineClass             |..
..+-------------------------------------+..
..| [+] acelerate(): void <<override>>  |..
..+-----------------+-------------------+..
.................../.\.....................
................../...\....................
.................+--+--+..............................................................
....................|.................................................................
....................+------------------------------------------+......................
....................|..........................................|......................
..+-----------------+-------------------+....+-----------------+-------------------+..
..|           <<concrete>>              |....|           <<concrete>>              |..
..|            StreetCarClass           |....|           OffRoadCarClass           |..
..+-------------------------------------+....+-------------------------------------+..
..| [+] acelerate(): void <<override>>  |....| [+] acelerate(): void <<override>>  |..
..+-------------------------------------+....+-------------------------------------+..
......................................................................................

(2.2) 继承图

在某些情况下,“EngineClass”的对象可能有子类。

...........................................
..+-------------------------------------+..
..|           <<abstract>>              |..
..|             EngineClass             |..
..+-------------------------------------+..
..| [+] acelerate(): void <<override>>  |..
..+-----------------+-------------------+..
.................../.\.....................
................../...\....................
.................+--+--+..............................................................
....................+------------------------------------------+......................
....................|..........................................|......................
....................|..........................................|......................
..+-----------------+-------------------+....+-----------------+-------------------+..
..|           <<concrete>>              |....|           <<concrete>>              |..
..|          StreetEngineClass          |....|          OffRoadEngineClass         |..
..+-------------------------------------+....+-------------------------------------+..
..| [+] startEngine(): void <<override>>|....| [+] startEngine(): void<<override>> |..
..+-------------------------------------+....+-------------------------------------+..
......................................................................................

3 个回答

现在,在这种情况下,一个类有一个至少一个组成成员,并且当主类被覆盖时,它的类型可能会被覆盖。这有时被称为“并行层次软件模式”或“双层次软件模式”。

您只提到了每个主类的 2 个子类,但实际上可能还有更多。

通常我制作这样的图表有两种方式。一个,我制作了第一个图表,添加了一个注释,表明它是这种情况。

3.1 主要并行层次图

..............................................................................
..+-------------------------------------+........+-------------------------+..
..|           <<abstract>>              |........|       <<abstract>>      |..
..|             CarClass                |........|        EngineClass      |..
..+-------------------------------------+........+-------------------------+..
..| [#] Engine: EngineClass             |<*>-----+ [+] startEngine(): void |..
..+-------------------------------------+........+------------+------------+..
..| [+] acelerate(): void <<virtual>>   |.....................|...............
..+--------------+----------------------+.....................|...............
.................|............................................|...............
.................+--------------------------------------------+...............
.................|............................................................
........+--------+-------+....................................................
........|   Note:        |....................................................
........|   Paralell     /....................................................
........|   Hierarchy   /| ...................................................
........|              / |....................................................
........+-------------/--+....................................................
..............................................................................

第二种情况,当两个类都有子类都添加成员时。

3.2 附加并行层次图

..............................................................................
..+---------------------------------------+........+-------------------------+..
..|             <<concrete>>              |........|       <<concrete>>      |..
..|            OffRoadCarClass            |........|    OffRoadEngineClass   |..
..+---------------------------------------+........+-------------------------+..
..| [+] createEngine(): void <<override>> |<*>-----+ [+] startEngine(): void |..
..+---------------------------------------+........| [+] nitroLevel(): void  |..
..| [+] useNitro(): void                  |........+------------+------------+..
..| [+] acelerate(): void <<override>>    |.....................|...............
..+--------------+------------------------+.....................|...............
.................|..............................................|...............
.................+----------------------------------------------+...............
.................|............................................................
........+--------+-------+....................................................
........|   Note:        |....................................................
........|   Paralell     /....................................................
........|   Hierarchy   /| ...................................................
........|              / |....................................................
........+-------------/--+....................................................
..............................................................................

如有必要,我可能会添加其他图表。

4 显示代码

为了管理这种“并行”层次结构,通常,复合成员的创建由重写方法管理。

public abstract class EngineClass
{
    public void startEngine() { ... }  
} // EngineClass

public abstract class CarClass
{
    protected EngineClass engine;  

    public CarClass()
    {
      // ...
    }

    public EngineClass createEngine()
    {
      EngineClass Result = new EngineClass();
      return Result;
    }

    public void start()
    {
      this.Engine = createEngine();
    }
} // CarClass

public class StreetCarClass extends CarClass
{
     public StreetCarClass()
     {
       // ...
     }

    @override
    public EngineClass createEngine()
    {
      EngineClass Result = new StreetCarEngineClass();
      return Result;
    }
} // StreetCarClass 

public class OffRoadCarClass extends CarClass
{
     public OffRoadCarClass()
     {
       // ...
     }

    @override
    public EngineClass createEngine()
    {
      EngineClass Result = new OffRoadCarEngineClass();
      return Result;
    }
} // OffRoadCarClass 

public class ExampleClass
{
    public static main()
    {
      EngineClass OffRoadCar = new OffRoadCarClass();
      OffRoadCar.start();
    }
} // OffRoadCarClass

干杯。

附:我可以,你的,haz 一个 Fishburguer 吗?

【讨论】:

  • 你用什么来生成这些图表?
  • @Marvo:这个工具,asciiflow.com/#Draw,但是,我手工编码了一些东西
  • 非常感谢您为详尽涵盖该主题所做的努力。但我不太明白一些事情。我只能做一张大图。我应该明白我上面的图表是正确的,我只需要添加“Parallel hierarchies”注释吗?
  • @annouk:您的图表是正确的。在 U.M.L.有几种方法可以绘制图表,但这并不意味着它们是错误的。我只是发布了一个带有不同图表的替代解决方案。只需添加评论。
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多