2012-07-13 23 views
5

Me preguntaba si puedo modelar la relación entre las dos jerarquías de clases abajo, en la forma en que lo hice:UML composición diagrama de clases con la clase jerarquías

car-engine composition relationship

El código que representaría el significado de esto sería algo así como:

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

... y lo mismo para el OffroadCar clase, sería hacer algo como engine = new OffroadEngine(). No he incluido nada sobre el método accelerate(), no es relevante.

Solo quiero saber si la composición se modela correctamente o si es redundante o incluso incorrecta para agregar tantas flechas de composición.

+0

Esto huele a tarea. Si es así, márcalo como tal. – Jochen

+0

No, no es tarea: P – annouk

Respuesta

3

Antes de la pregunta de respuesta, este es uno de esos casos, donde es una buena idea dividir las relaciones de jerarquía de las relaciones de composición, como si fueran tipos diferentes de diagramas.

Nota: Agregué Engine al diagrama, como "protected", y prefijo "Class", para evitar confusiones.

(1) Diagrama Composición

Un objeto de "CarClass" su compuesta por 1 solo objeto de "EngineClass".

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

(2,1) Inheritance Diagrama

Un objeto de "CarClass" puede tener clases secundarias, en ciertos escenarios.

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

(2,2) Inheritance Diagrama

Un objeto de "EngineClass" puede tener clases secundarias, en ciertos escenarios.

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

3 respuesta

Ahora, este es un caso, donde una clase tiene un uno unleast miembro de componer, y su tipo puede ser anulado, cuando la clase principal su overriden. Esto a veces se denomina "Patrón de software de jerarquía de Paralell" o "Patrón de software de doble jerarquía".

Solo ha mencionado 2 subclases de cada clase principal, pero, en realidad, podría haber más.

Normalmente hago gráficos como este de 2 maneras. Primero, hago el primer diagrama, agregando un comentario, que indica que es este caso.

3.1 Principal Paralell Diagrama de Jerarquía

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

El segundo caso, su cuando ambas clases tienen clases hijas que tanto agregar miembros.

3.2 adicional Paralell Diagrama de Jerarquía

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

I puede añadir diagramas adicionales, si necesarilly.

4 Muéstrame el código

el fin, para gestionar este jerarquías "paralelas", por lo general, la creación de los elementos compuestos su gestionado por un método sobreescrito.

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 

Cheers.

P.S. ¿Puedo, ur, haz a Fishburguer?

+1

¿Qué usaste para generar esos diagramas? – Marvo

+3

@Marvo: esta herramienta, http://www.asciiflow.com/#Draw, pero, codifiqué a mano algunas cosas – umlcat

+0

Muchas gracias por sus esfuerzos para cubrir exhaustivamente el tema. Pero no entiendo muy bien algo. No puedo hacer más de un gran diagrama. ¿Debo entender que mi diagrama de arriba es correcto y solo necesito agregar el comentario "Jerarquías paralelas"? – annouk

Cuestiones relacionadas