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
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}