Padrão MVC

De Aulas

Afluentes: Programação em Java; Padrões de Arquitetura para desenvolvimento web e mobile

Definição

  • MVC: Model-View-Controller
  • Arquitetura de desenvolvimento de Software
  • Criada pela Xerox nos anos 80
  • Usada para interfaces Gráficas
  • Se popularizou para aplicações web e móveis

Model

  • Camada lógica da aplicação
  • Interface entre o Controller com o View
  • Gerencia o comportamento dos dados por regras de negócios, lógica e funções
  • Recupera e grava os dados
  • Encapsulamento dos dados independente da apresentação

View

  • Camada de representação dos dados
  • Usa tabelas, diagramas, formulários, etc.
  • Os dados visualizados são obtidos do Model
  • Camada de interação com o usuáiro

Controller

  • Camada de controle
  • Focado na ação do usuário
  • onde são manipulados os dados que o usuário insere ou atualiza
  • O Controller envia as ações ao Model e para a View onde são realizadas as operações.

Interação entre as Camadas

  • Controller:
    • Pode enviar dados para o modelo atualizar o estado
    • Pode enviar comandos para o View alterar a representação da visão do modelo (refresh)
  • Model:
    • Armzena os dados e notifica a View e o Controller quando há mudança de estado (refresh na View)
  • View:
    • Exibe os dados

Visão Prática

MVC visaopratica.png

Vantagens e Desvantagens do MVC

Vantagens
  • Modular, fácil manutenção e testes
  • Simplicidade, inclui novos módulos apenas com a inclusão de views e controllers
  • Aplicação escalável
  • Desenvolvimento das camadas em paralelo, pois são módulos independentes
  • Facilita o reuso de código
  • Fácil de mudar a interface sem necessidade de modificar a camada de negócios
  • Permite que os desenvolvedores e designers trabalhem em paralelo de forma independente
  • Pode alterar parte da aplicação sem necessidade de alterar outras partes
Desvantagens
  • Necessidade de mais tempo para modelagem do sistema
  • Requer pessoas com conhecimento do modelo
  • A complexidade e quantidade de arquivos e pastas cresce conforme cresce o tamanho do sistema

Exemplo

View

 1import javax.swing.BoxLayout;
 2import javax.swing.JButton;
 3import javax.swing.JFrame;
 4import javax.swing.JLabel;
 5import javax.swing.JTextField;
 6import java.awt.event.ActionListener;
 7
 8public class View extends JFrame {
 9    private static final long serialVersionUID = 1L;
10    private JTextField a, b;
11    private JLabel solution;
12    private JButton button;
13
14    public View() {
15        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
17
18        add(a = new JTextField(8));
19        add(new JLabel("+"));
20        add(b = new JTextField(8));
21        add(solution = new JLabel(" "));
22        add(button = new JButton("calcula"));
23
24        pack();
25        setVisible(true);
26    }
27
28    // Métodos getters para recuperar as informações
29
30    public String getA() {
31        return a.getText();
32    }
33
34    public String getB() {
35        return b.getText();
36    }
37
38    // Métodos setterrs para atualizar as informações
39
40    public void setSolution(String result) {
41        solution.setText(result);
42    }
43
44    // Quem gerencia a ação do botão é o controller
45
46    public void setButtonBehavior(ActionListener botaoBehavior) {
47        button.addActionListener(botaoBehavior);
48    }
49}

Model

 1public class Model {
 2    private double x = 0;
 3    private double y = 0;
 4    private double out = 0;
 5
 6    public Model() {
 7    }
 8
 9    public void setNumeros(double x, double y) {
10        this.x = x;
11        this.y = y;
12    }
13
14    public void compute() {
15        out = x + y;
16    }
17
18    public double getOutput() {
19        return out;
20    }
21
22}

Controller

 1import java.awt.event.ActionEvent;
 2import java.awt.event.ActionListener;
 3
 4public class Controller {
 5    Model model;
 6    View view;
 7
 8    public Controller(Model aModel, View aView) {
 9        model = aModel;
10        view = aView;
11        view.setButtonBehavior(new ActionListener() {       // gerencia a ação do botão na view
12            public void actionPerformed(ActionEvent e) {
13                double a = Double.parseDouble(view.getA()); // pega a primeira entrada
14                double b = Double.parseDouble(view.getB()); // pega a segunda entrada
15                model.setNumeros(a, b);                     // envia os dados para o model
16                model.compute();                            // executa algo com os dados
17                double solution = model.getOutput();        // retorna um resultado
18                view.setSolution(String.valueOf(solution)); // atualiza os dados na view
19            }
20        });
21    }
22}

Programa Principal

Utiliza o modelo MVC produzido.

1public class Main {
2    public static void main(String[] args) {
3      Model model = new Model();
4      View view = new View();
5      new Controller(model, view);
6    }
7}