Ola, a uns dias atras estudei sobre MVC mas não consigo ainda pensa como deixar minha Visão totalmente independente do meu modelo, mas mesmo assim resolvi começar a fazer meu aplicativo que na verdade ele vai servir pra controlar caixa, entrada e saida de merdadoria, estoque, clientes e fornecedores.
Vamos ao que eu já fiz (resumo)
DAO generico
[code]public class GenericDAO<T, PK extends Serializable> {
private Class<?> persistentClass;
private Session session;
public GenericDAO(){}
public GenericDAO(Class<?> persistentClass){
this.setPersistentClass(persistentClass);
}
public GenericDAO(Class<?> persistentClass, Session session){
this.setPersistentClass(persistentClass);
this.session = session;
}
public void setPersistentClass(Class<?> persistentClass) {
this.persistentClass = persistentClass;
}
public Class<?> getPersistentClass() {
return persistentClass;
}
public void setSession(Session session){
this.session = session;
}
public Session getSession(){
return session;
}
public T get(PK id){
@SuppressWarnings("unchecked")
T object = (T) getSession().get(getPersistentClass(), id);
return object;
}
public void set(T obj, Transaction transaction){
getSession().saveOrUpdate(obj);
getSession().flush();
}
@SuppressWarnings("unchecked")
public List<T> getAll(){
Criteria criteria = getSession().createCriteria(getPersistentClass());
return criteria.list();
}
}[/code]
Interfase Controle (ainda incompleta)
public interface Controle<T> {
public List<T> getAll();
}
Controle dos Clientes (ainda incompleto)
[code]public class ControleCliente implements Controle{
final GenericDAO<Cliente, Long> dao = new GenericDAO<Cliente, Long>(
Cliente.class, HibernateUtil.getSession());
public ControleCliente(){
}
public List<Cliente> getAll(){
return dao.getAll();
}
public Double getAReceber(Cliente cliente){
double aReceber = 0;
for(Venda venda : cliente.getVendas()){
for(Saida saida : venda.getSaidas()){
aReceber += saida.getPesoSaco()*saida.getQuant()*saida.getPreco();
}
for(Recebimento rec : venda.getRecebimentos()){
aReceber -= rec.getValor();
}
}
return aReceber;
}
}[/code]
Enum com as colunas do TableModel
@SuppressWarnings("unchecked")
public enum TableColumnsVer implements Coluna<Cliente> {
NOME {
@Override
public Class<?> getColumnClass() {
return String.class;
}
@Override
public String getColumnName() {
return "Nome";
}
@Override
public Object getValue(Cliente row) {
return row.getNome();
}
},
TEL_1 {
@Override
public Class<?> getColumnClass() {
return String.class;
}
@Override
public String getColumnName() {
return "Telefone";
}
@Override
public Object getValue(Cliente row) {
return row.getTel_1();
}
},
TEL_2 {
@Override
public Class<?> getColumnClass() {
return String.class;
}
@Override
public String getColumnName() {
return "Telefone";
}
@Override
public Object getValue(Cliente row) {
return row.getTel_2();
}
},
A_RECEBER {
@Override
public Class<?> getColumnClass() {
return Double.class;
}
@Override
public String getColumnName() {
return "A receber";
}
@Override
public Object getValue(Cliente row) {
return getControle().getAReceber(row);
}
};
public ControleCliente controleCliente;
@Override
public int getModelIndex() {
return this.ordinal();
}
@Override
public int getWidth() {
return 50;
}
@Override
public ControleCliente getControle(){
if(controleCliente == null){
controleCliente = new ControleCliente();
}
return controleCliente;
}
}
Visão dos Clientes
[code]public class Ver extends JPanel {
private JScrollPane scrTbl;
private JTable tbl;
private JPanel pBts;
private JButton bVer;
private JButton bEditar;
private JButton bAdd;
private TableModel tblModel;
private ControleCliente controleCliente;
public Ver(){
super();
inicia();
}
private void inicia(){
this.setLayout(new BorderLayout());
this.add(getScrTbl(), BorderLayout.CENTER);
this.add(getPBts(), BorderLayout.SOUTH);
}
private JPanel getPBts() {
if(pBts == null){
pBts = new JPanel();
pBts.add(getBVer());
pBts.add(getBEditar());
pBts.add(getBAdd());
}
return pBts;
}
private JButton getBVer() {
if(bVer == null){
bVer = new JButton("Ver Vales");
}
return bVer;
}
private JButton getBEditar() {
if(bEditar == null){
bEditar = new JButton("Editar");
}
return bEditar;
}
private JButton getBAdd() {
if(bAdd == null){
bAdd = new JButton("Novo Cliente");
}
return bAdd;
}
private JScrollPane getScrTbl(){
if (scrTbl == null) {
scrTbl = new JScrollPane();
scrTbl.setViewportView(getTbl());
}
return scrTbl;
}
private JTable getTbl() {
if(tbl==null){
tbl = new JTable();
tbl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tbl.setModel(getTblModel());
}
return tbl;
}
private TableModel<Cliente> getTblModel() {
if(tblModel==null){
tblModel = new TableModel<Cliente>(getControle().getAll(), TableColumnsVer.values());
}
return tblModel;
}
private ControleCliente getControle(){
if(controleCliente == null){
controleCliente = new ControleCliente();
}
return controleCliente;
}
}[/code]
bom essas são algumas class da minha aplicação mas já da de vê como ta ficando minha estrutura
Mas oque eu gostaria de ter certeza é o seguinte
:arrow: O modelo ficam com as class de persistência (que representam as tabelas do banco), com os DAO e com o HiberneitUtil
:arrow: O controle e o responsável de por métodos como obterTodos() (mas não fazer a busca no banco, mas sim pedir ao DAO), abrir e fechar as sessões e as transações, fazer cálculos com os dados pegos dos DAOs (como receber o preço de cada produto e multiplicar pela quantidade) e tratar as acessões
:arrow: A visão fica responsável, somente por montar a interface gráfica tendo direito a somente acessar métodos do controle e exibir os eros pro usuário tratados pelo controle
Montei minha aplicação pensando nesses conceitos mas um eu não consegui cumprir o de usar somente métodos do controle na visão pois não consigo pensar em um jeito de no enum das colunas não usar métodos como getNome() que é da class cliente que fica no modelo.
Gostaria de saber se isso quebra o padrão MVC e se o que eu penso sobre MVC está coreto??
Até!