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

From Wiki**3

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

Este exercício saiu no teste de 2011/01/10.

Problema

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).

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-20110110-seq.png