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é!

