Padrão Básico de Projeto: Interfaces e Polimorfismo

Herança de implementação versus herança de interface

"Program to an interface, not an implementation"

Exemplo no uso de interfaces

  // Como queremos usar o resultado final que contruiremos num servlet:
  ComponenteDeSelecao cds =
        new ComponenteDeSelecao(umaColeçãoDeAlunos, "João");
  response.out.println(cds.geraListBox());

  cds = new ComponenteDeSelecao(umaColeçãoDeDisciplinas, "Programação");
  response.out.println(cds.geraListBox());

interface SelecionavelPorNome {
  Iterator getIteradorPorNome(String nome);
}

interface Nomeavel {
  String getNome();
}

class ColecaoDeAlunos implements SelecionavelPorNome {
  // ...
  Iterator getIteradorPorNome(String nome) {
    // ...
  }
}

class Aluno implements Nomeavel {
  // ...
  String getNome() { ... }
}

class ColeCAoDeProfessores implements SelecionAvelPorNome {
  // ...
  Iterator getIteradorPorNome(String nome) {
    // ...
  }
}

class Professor implements Nomeavel {
  // ...
  String getNome() { ... }
}

class ColecaoDeDisciplinas implements SelecionavelPorNome {
  // ...
  Iterator getIteradorPorNome(String nome) {
    // ...
  }
}

class Disciplina implements Nomeavel {
  // ...
  String getNome() { ... }
}

class ComponenteDeSelecao {
  Iterator it;
  // observe o tipo do parâmetro (uma interface)
  public ComponenteDeSelecao(SelecionavelPorNome coleção, String nome) {
    it = coleção.getIteradorPorNome(nome); // chamada polimórfica
  }
  // ...
  String geraListBox() {
    StringBuffer resposta = new StringBuffer();
    resposta.append("<select name=\"nome\" size=\"1\">");
    while(it.hasNext()) {
      int i = 1;
      // observe o tipo do objeto
      Nomeavel obj = (Nomeavel)it.next();
      resposta.append("<option value=\"escolha" + i + "\">" +
                      obj.getNome() + // chamada polimórfica
                      "</option>");
    }
    resposta.append("</select>");
    return resposta.toString();
  }
}

Como achar interfaces

Exercícios para casa

programa