Ola pessoal em minha peregrinação rumo ao MVC fiz esse sistema de teste.
Descrição do sistema :
Na verdade é um sistema bem simples existem dois JTextField no qual o usuario digita valores numericos e depois pode clicar em somar ou subtrair. o resultado aparece em um terceiro JTextField.
O Sistema é dividido em 6 arquivos :
1)Calc.java = Seria nossa regra de negocios.
2)Command.java = A Interface Command
3)CommandSomar.java = O comando responsavel por adicionar
4)CommandSubtrair.java = O comando responsavel por subtrair
5)JFrameCalc.java = Estende javax.swing.JFrame é view da aplicação
Nesse arquivo existe uma classe interna que seria uma especie de controller responsavel por executar os comandos.
6)MainCalc.java = Classe que contem o metodo main da aplicação :
agora segue os códigos :
package command.dois;
import java.util.*;
public class Calc extends Observable {
private int ultValue=0;
public void somar(int a, int b) {
setUtlValue(a + b);
}
public void subtrair(int a, int b) {
setUtlValue(a - b);
}
private void setUtlValue(int newValue) {
ultValue = newValue;
setChanged();
notifyObservers(this);
}
public int getUtlValue() {
return ultValue;
}
}
package command.dois;
public interface Command {
public void execute(int a, int b);
}
package command.dois;
public class CommandSomar implements Command {
private Calc calc;
public CommandSomar(Calc calc) {
this.calc = calc;
}
public void execute(int a, int b) {
calc.somar(a,b);
}
}
package command.dois;
public class CommandSubtrair implements Command {
private Calc calc;
public CommandSubtrair(Calc calc) {
this.calc = calc;
}
public void execute(int a, int b) {
calc.subtrair(a,b);
}
}
package command.dois;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class JFrameCalc extends JFrame implements Observer {
private JButton btSomar,btSubtrair;
private JTextField txUm,txDois,txResultado;
public JFrameCalc() {
super("Calculadora ");
buildInterface();
}
private void buildInterface(){
Calc calc = new Calc();
calc.addObserver(this);
Container container = getContentPane();
btSomar = new JButton("Somar");
btSubtrair = new JButton("Subtrair");
Event evSomar = new Event(new CommandSomar(calc));
Event evSubtrair = new Event(new CommandSubtrair(calc));
btSomar.addActionListener(evSomar);
btSubtrair.addActionListener(evSubtrair);
txUm = new JTextField("",5);
txDois = new JTextField("",5);
txResultado = new JTextField("0",5);
txResultado.setEditable(false);
container.add(new JLabel("Cacl"),BorderLayout.NORTH);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(new JLabel("Um"));
panel.add(txUm);
panel.add(new JLabel("Dois"));
panel.add(txDois);
panel.add(txResultado);
panel.add(btSomar);
panel.add(btSubtrair);
container.add(panel,BorderLayout.CENTER);
setSize(200,200);
setVisible(true);
}
class Event implements ActionListener {
private Command command;
public Event( Command command) {
this.command = command;
}
public void actionPerformed(ActionEvent e) {
command.execute(
Integer.parseInt(txUm.getText()),
Integer.parseInt(txDois.getText()));
}
}
public void update(Observable o, Object arg) {
Calc calc = (Calc)arg;
txResultado.setText(calc.getUtlValue()+"");
}
}
package command.dois;
import javax.swing.*;
public class MainCalc {
public static void main(String args[]) {
JFrameCalc application = new JFrameCalc();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
vamos agora algumas questões :
Primeiro a classe Calc implementa a interface Observable pois ele será o model e a classe JFrameCalc implementa a interface Observer pois esta classe será view… tudo até ae certo , né ?
O Grande problema vem na construção do Controller no caso acima eu criei uma classe interna Event que recebe um Command como Argumento.eu crio um Event para cada botão . tipo para somar eu crio um Evento que recebe o CommandSomar como argumento e assim por diante .
o que acham dessa estrutura ?
como posso torna-la melhor ?
falo isso porque apesar que essa estrutura funcionar razoavelmente bem neste exemplo. Mas se o sistema fosse maior ? Com 200 View… Teria sei la 500 Commands (por exemplo) ?
Outra questão é quando eu tenho um sistema que tem 50 Regras de negocios eu vou ter que ter 50 views e o PIOR cada view tera que ter sua propria regra de negocio ?
Baixe os fontes clicando abaixo.
http://ualex.sosphp.com/Command.zip
Obrigado pessoal. Qualquer ajuda sera bem vinda.