Este exercício saiu no teste de 2011/01/10.
Considere o seguinte programa em Java:
public abstract class Shell {
protected Ghost _ghost;
protected Shell(Ghost ghost) {
_ghost = ghost;
System.out.println(getClass().getName());
}
public abstract boolean isOperational();
public abstract void powerOn();
}
public class Virtual extends Shell {
public Virtual(Ghost ghost) { super(ghost); }
public boolean isOperational() { return _ghost.isHappy(); }
public void powerOn() { System.out.println("always on: nothing to do"); }
}
public class Physical extends Shell {
private boolean _poweredOn = false;
public Physical(Ghost ghost) { super(ghost); powerOn(); }
public boolean isOperational() { return _poweredOn && _ghost.isHappy(); }
public void powerOn() { _poweredOn = true; }
}
public class NotReadyException extends Exception {}
public class ShellTester {
public void assertOperational(Shell shell) throws NotReadyException {
if (!shell.isOperational()) {
throw new NotReadyException();
}
}
}
public class Ghost {
String _name;
public Ghost(String name) { _name = name; }
public boolean isHappy() { return true; /* ghosts are happy */ }
}
public class Application {
public static void main(String args[]) {
Shell kusanagi = new Virtual(new Ghost("草薙素子"));
Shell batou = new Physical(new Ghost("バトー"));
ShellTester tester = new ShellTester();
try { tester.assertOperational(kusanagi); }
catch (NotReadyException e) { System.out.println("Kusanagi not ready!"); }
try { tester.assertOperational(batou); }
catch (NotReadyException e) { System.out.println("Batou not ready!"); }
}
}
Desenhe o diagrama de sequência UML correspondente à execução do programa, incluindo as etapas de criação dos objectos. 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; não é necessário explicitar o construtor de Shell).
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).