fork download
  1. // 1. Extração da Classe Curso (Mantida da refatoração anterior)
  2. class Curso {
  3. private String nome;
  4. private String nivel;
  5. private double mensalidade;
  6.  
  7. public Curso(String nome, String nivel, double mensalidade) {
  8. this.nome = nome;
  9. this.nivel = nivel;
  10. this.mensalidade = mensalidade;
  11. }
  12.  
  13. public String getNome() { return nome; }
  14. public String getNivel() { return nivel; }
  15. public double getMensalidade() { return mensalidade; }
  16. }
  17.  
  18. // 2. Criação de hierarquia para o Trabalho de Conclusão
  19. abstract class TrabalhoConclusao {
  20. public abstract String getDadosTrabalho(String nivelCurso);
  21. }
  22.  
  23. // 2.1 Subclasse para o caso onde NÃO há trabalho (Null Object)
  24. class TrabalhoNulo extends TrabalhoConclusao {
  25. @Override
  26. public String getDadosTrabalho(String nivelCurso) {
  27. return ""; // Não retorna nada, evitando verificações de null
  28. }
  29. }
  30.  
  31. // 2.2 Subclasse para o caso onde HÁ trabalho
  32. class TrabalhoRealizado extends TrabalhoConclusao {
  33. private String orientador;
  34. private String titulo;
  35. private String nota;
  36.  
  37. public TrabalhoRealizado(String orientador, String titulo, String nota) {
  38. this.orientador = orientador;
  39. this.titulo = titulo;
  40. this.nota = nota;
  41. }
  42.  
  43. @Override
  44. public String getDadosTrabalho(String nivelCurso) {
  45. String resp = "Título ";
  46. switch (nivelCurso) {
  47. case "Graduação": resp += "do TCC: "; break;
  48. case "Lato sensu": resp += "da monografia: "; break;
  49. case "Mestrado": resp += "da dissertação: "; break;
  50. case "Doutorado": resp += "da tese: "; break;
  51. }
  52. resp += titulo + "\n";
  53. resp += "Orientador(a): Prof. " + orientador + "\n";
  54. resp += "Nota: " + nota + "\n";
  55. return resp;
  56. }
  57. }
  58.  
  59. // 3. Superclasse abstrata para Aluno
  60. abstract class Aluno {
  61. protected String nome;
  62. protected int matricula;
  63. protected Curso curso;
  64. protected boolean cursoFinalizado;
  65. protected int anoFinalizacao;
  66. protected TrabalhoConclusao trabalho;
  67.  
  68. public Aluno(String nome, int matricula, Curso curso, boolean cursoFinalizado, int anoFinalizacao, TrabalhoConclusao trabalho) {
  69. this.nome = nome;
  70. this.matricula = matricula;
  71. this.curso = curso;
  72. this.cursoFinalizado = cursoFinalizado;
  73. this.anoFinalizacao = anoFinalizacao;
  74. this.trabalho = trabalho;
  75. }
  76.  
  77. public abstract String getDados();
  78.  
  79. // Método auxiliar para evitar duplicação de código nas subclasses
  80. protected String getDadosAcademicos() {
  81. String resp = "Aluno: " + this.nome + "\n";
  82. resp += "Curso: " + this.curso.getNivel() + " em " + this.curso.getNome() + "\n";
  83. if (this.cursoFinalizado) {
  84. resp += "Curso finalizado em " + anoFinalizacao + "\n";
  85. resp += trabalho.getDadosTrabalho(curso.getNivel());
  86. }
  87. return resp;
  88. }
  89. }
  90.  
  91. // 4. Subclasse para alunos sem bolsa
  92. class AlunoRegular extends Aluno {
  93. public AlunoRegular(String nome, int matricula, Curso curso, boolean cursoFinalizado, int anoFinalizacao, TrabalhoConclusao trabalho) {
  94. super(nome, matricula, curso, cursoFinalizado, anoFinalizacao, trabalho);
  95. }
  96.  
  97. @Override
  98. public String getDados() {
  99. String resp = getDadosAcademicos();
  100. resp += "Mensalidade: R$ " + this.curso.getMensalidade() + "\n";
  101. return resp;
  102. }
  103. }
  104.  
  105. // 5. Subclasse para alunos bolsistas
  106. class AlunoBolsista extends Aluno {
  107. private double desconto;
  108.  
  109. public AlunoBolsista(String nome, int matricula, Curso curso, boolean cursoFinalizado, int anoFinalizacao, TrabalhoConclusao trabalho, double desconto) {
  110. super(nome, matricula, curso, cursoFinalizado, anoFinalizacao, trabalho);
  111. this.desconto = desconto;
  112. }
  113.  
  114. @Override
  115. public String getDados() {
  116. String resp = getDadosAcademicos();
  117. resp += "Bolsista com desconto de: " + this.desconto + "%\n";
  118. resp += "Mensalidade: R$ " + this.curso.getMensalidade() * (1 - this.desconto / 100) + "\n";
  119. return resp;
  120. }
  121. }
  122.  
  123. // 6. Classe de Teste
  124. class Teste {
  125. public static void main (String args[]) {
  126. Curso c1 = new Curso("ADS", "Graduação", 920.50);
  127. Curso c2 = new Curso("Computação Aplicada", "Mestrado", 2150.45);
  128.  
  129. // Instanciando TrabalhoNulo para o aluno 1
  130. TrabalhoConclusao t1 = new TrabalhoNulo();
  131. Aluno aluno1 = new AlunoBolsista("Martin Fowler", 11223344, c1, false, -1, t1, 20.5);
  132.  
  133. // Instanciando TrabalhoRealizado para o aluno 2
  134. TrabalhoConclusao t2 = new TrabalhoRealizado("Peter Coad", "Impacto da Refatoração", "9.5");
  135. Aluno aluno2 = new AlunoRegular("Kent Beck", 22334455, c2, true, 2019, t2);
  136.  
  137. System.out.println(aluno1.getDados());
  138. System.out.println("-------------------");
  139. System.out.println(aluno2.getDados());
  140. }
  141. }
Success #stdin #stdout 0.25s 61184KB
stdin
Standard input is empty
stdout
Aluno: Martin Fowler
Curso: Graduação em ADS
Bolsista com desconto de: 20.5%
Mensalidade: R$ 731.7975

-------------------
Aluno: Kent Beck
Curso: Mestrado em Computação Aplicada
Curso finalizado em 2019
Título da dissertação: Impacto da Refatoração
Orientador(a): Prof. Peter Coad
Nota: 9.5
Mensalidade: R$ 2150.45