具有类层次结构的UML类图组合

ann*_*ouk 5 java uml class-diagram composition

我想知道我是否可以按照我的方式建模下面两个类层次结构之间的关系:

汽车发动机组成关系

代表其含义的代码如下:

public abstract class Car
{
    protected Engine engine;  
}
public class StreetCar extends Car
{
     public StreetCar()
     {
          engine = new StreetEngine();
     }
}
Run Code Online (Sandbox Code Playgroud)

......类似于OffroadCar类,它会做类似的事情engine = new OffroadEngine().我没有包含有关accele()方法的任何内容,它没有关系.

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

uml*_*cat 3

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

注意:我将引擎添加到图中,作为“受保护”和“类”前缀,以避免混淆。

(1) 组成图

“CarClass”的对象由 1 个“EngineClass”的单个对象组成。

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

(2.1) 继承图

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

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

(2.2) 继承图

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

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

3 个回答

现在,这是一种情况,其中一个类具有至少一个组成成员,并且当主类被重写时,其类型可能被重写。这有时称为“并行层次结构软件模式”或“双层次结构软件模式”。

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

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

3.1 主要并行层次结构图

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

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

3.2 附加并行层次结构图

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

如果需要的话,我可以添加额外的图表。

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
Run Code Online (Sandbox Code Playgroud)

干杯。

PS 我可以吃鱼汉堡吗?

  • @Marvo:这个工具,http://www.asciiflow.com/#Draw,但是,我手工编码了一些东西 (3认同)