Model-View-Controller (MVC)

Model-View-Controller é um padrão de arquitetura de software usado para implementa uma Interface de Usuário Final.

O objetivo do MVC é separar a lógica em três elementos:

O MVC é usado em várias áreas, em vários tipos de projetos, aqui veremos exemplos de MVC para um projeto em Java.

MVC para Java

Neste curso faremos projetos usando o padrão MVC. Todos os projetos seguirão o seguinte padrão:

Os exemplos vistos nas aulas seguirão o seguinte fluxo

MVCExemplo01 Controller Controller Model Model Controller->Model View View Controller->View View->Controller

Exemplos de Modelos de Projetos

Exemplo1: Interação de um usuário com um banco de dados de nomes

Vamos considerar um projeto que guarda nomes de pessoas em um banco de dados, e uma interface de usuário que permite ao usuário fazer uma busca de uma parte do nome, e inserir um nome

Teremos uma interface View

interface View {
  // configurações de gatilhos de ações
  public void addAcaoInserirNome(ActionListener acaoInserirNome);
  public void addAcaoBuscarNome(ActionListener acaoBuscarNome);

  // mostrar dados do programa
  public void mostrarNomes(List<String> nomes);

  // requisições de entrada de usuários
  public String getNomeBusca();
  public String getNomeInserir();
}

Teremos uma interface Model

interface Model {
  // ações para fazer em um banco de dados
  public List<String> buscarNome(String nome);
  public void inserirNome(String nome);
}

Teremos uma classe concreta Controller programado para as interface View e Model

class Controller {
  Model model;
  View view;

  public Controller(Model aModel, View aView){
    this.model = aModel;
    this.view = aView;
  }

  public void init(){
    view.addAcaoInserirNome(new AcaoInserirNome());
    view.addAcaoBuscarNome(new AcaoBuscarNome());
  }

  class AcaoBuscarNome implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e){

      // resuisita as entradas para o view
      String nome = view.getNomeBusca();

      // pede para o model fazer a busca
      List<String> nomes = model.buscarNome(nome);

      // pede para o view mostrar o resultado
      view.mostrarNomes(nomes);
    }
  }


  class AcaoInserirNome implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e){

      // resuisita as entradas para o view
      String nome = view.getNomeInserir();

      // pede para o model fazer a inserção
      model.inserirNome(nome);
    }
  }

}

Exemplo02: Interação de um usuário com um resolvedor matemático

Vamos considerar um projeto recebe dois números do usuário e faz algum tipo de conta.

interface View {
  // configurações de gatilhos de ações
  public void addAcaoCalcular(ActionListener acaoCalcular);

  // mostrar dados do programa
  public void mostrarResultado(int resultado);

  // requisições de entrada de usuários
  public int getNumeroA();
  public int getNumeroB();
}
interface Model {
  // ações para fazer em um banco de dados ou resolvedores matemáticos
  public int calcularNumeros(int a, int b);
}
class Controller {
  Model model;
  View view;

  public Controller(Model aModel, View aView){
    this.model = aModel;
    this.view = aView;
  }

  public void init(){
    view.addAcaoCalcular(new AcaoCalcular());
  }

  class AcaoCalcular implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e){

      // resuisita as entradas para o view
      int numeroA = view.getNumeroA();
      int numeroB = view.getNumeroB();

      // pede para o model fazer as contas
      int result = model.calcularNumeros(numeroA, numeroB);

      // mostra o resultado para o view
      view.mostrarResultado(result);
    }
  }

}

Mas onde estão as classes concretas de Model e View?

O modelo MVC permite que o programa seja flexível e que funcione com qualquer implementação das interfaces View e Model. Nos laboratórios vamos ver exemplos de implementações destas interfaces, e como testar as implementações.

.