2012-07-13 123 views
5

我想知道如果我可以模拟以下两种类层次结构之间的关系在我做的方式:UML类图组成层次结构,

car-engine composition relationship

,将代表的含义的代码这将是这样的:

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

...,同样的类OffroadCar,它会像做engine = new OffroadEngine()。我没有包含有关加速()方法的任何内容,但它并不相关。

我只是想知道,如果组成正确建模,或者如果它是多余的,甚至错误地添加许多组成箭头。

+0

这闻起来像功课。如果是,请将其标记为。 – Jochen 2012-07-14 00:04:20

+0

不,它不是作业:P – annouk 2012-07-14 18:45:25

回答

3

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

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

(1)组成图

“CarClass” 的一个目的其通过 “EngineClass” 的1个单个对象组成。

.............................................................................. 
..+-------------------------------------+........+-------------------------+.. 
..|   <<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回答

现在,这是的情况下,其中一类具有一个unleast构成构件,其类型可被重写,当主类其覆盖。这有时称为“Paralell层次结构软件模式”或“双层次结构软件模式”。

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

通常我会用这2种方法制作图表。一,我做出第一个图表,添加一条评论,表明它是这种情况。

3.1主要Paralell层次结构图

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

第二种情况,其时这两个类有子类,无论添加成员。

3。2附加Paralell层次结构图

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

我可以如果necesarilly添加额外的图,。

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 

干杯。

P.S.我可以吗,你是一个Fishburguer吗?

+1

你用什么来生成这些图表? – Marvo 2012-07-14 04:33:41

+3

@Marvo:这个工具,http://www.asciiflow.com/#Draw,但是,我用手编写了一些东西 – umlcat 2012-07-14 04:38:16

+0

非常感谢你的努力,详尽地讨论这个话题。但我不太明白。我不能做一个以上的大图。我是否应该明白我的上图是正确的,我只需要添加“并行层次结构”评论? – annouk 2012-07-14 19:04:27