Este exercício saiu no teste de 2010/01/21.
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).
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).