Introdução à Modelação com UML/Ghost in the Shell -- tick-tock

From Wiki**3

< Introdução à Modelação com UML

Este exercício saiu no teste de 2010/01/21.

Problema

Considere o seguinte programa em Java:

public abstract class Ghost {
  public Ghost() { System.out.println(getClass().getName()); }
  public abstract void tick(Shell shell);
  public void tock(Shell shell) {}
}

public class A extends Ghost {
  public void tick(Shell shell) { shell.use(new C()); }
}

public class B extends Ghost {
  public void tick(Shell shell) { shell.use(new A()); }
  public void tock(Shell shell) { shell.use(new A()); }
}

public class C extends Ghost {
  public void tick(Shell shell) { shell.use(new B()); }
  public void tock(Shell shell) { shell.use(new A()); }
}

public class Shell {
  Ghost _ghost = new A();
  public void tick() { _ghost.tick(this); }
  public void tock() { _ghost.tock(this); }
  public void use(Ghost ghost) { _ghost = ghost; }
}

public class GhostInTheShell {
  public static void main(String args[]) {
    Shell shell = new Shell();
    shell.tick();
    //!DIAG
    shell.tick(); shell.tock(); shell.tick();
  }
}

Desenhe o diagrama de sequência UML correspondente à execução do programa acima, incluindo as etapas de criação dos objectos (ignore as linhas do programa assinaladas com //!DIAG). O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as de retorno).

Solução

Note-se que alguns objectos não indicam variáveis associadas (os resultados da criação desses objectos são imediatamente passados como argumentos de outros métodos).

PO-20100121-seq.png