Estrutura de classes

estou desenvolvendo uma agenda, em java, pois estou iniciando na linguagem.
pensei em criar as seguintes classes:

Pessoa -> terá os dados dos contatos da agenda
BancoDados -> conecta e fecha a conexão ao banco de dados
Agenda -> funcionalidades da agenda como inserir um contato, apagar um contato. esta, extende a BancoDados

mas depois, pensei em criar um método dentro de agenda, para conectar ao banco de dados, e nao criar uma classe BancoDados

minha pergunta é:
neste caso, qual seria a melhor estruturação das classes?
alguma das 2 maneiras que citei, ou outra?

grato

Julio Romano

Então Juliano, as duas formas são válidas. Tudo é válido, desde que funcione.

Tem uma classe que cuida só do banco é interessante, principalmente se você tiver mais de uma classe q acesse o banco. Sendo assim, é realmente interessante tem uma classe só para o banco, por 2 motivos:
1- Esse é a idéia qdo se cria uma classe. Que cada classe tenha UMA função específica.
2- Você não sabe quanto essa sua agenda pode crescer e agregar funcionalidades. Entao, ter um esquema de classes bem montado, irá facilitar isso.

Mas, se isso é apenas um teste, onde a única coisa que você quer aprender é programar em Java, e além disso, quer algo que seja além de tudo, simples de entender, entao nao há problema em fazer isso tudo em uma unica classe.

ok?

[quote=“julioromano”]estou desenvolvendo uma agenda, em java, pois estou iniciando na linguagem.
pensei em criar as seguintes classes:

Pessoa -> terá os dados dos contatos da agenda
BancoDados -> conecta e fecha a conexão ao banco de dados
Agenda -> funcionalidades da agenda como inserir um contato, apagar um contato. esta, extende a BancoDados

mas depois, pensei em criar um método dentro de agenda, para conectar ao banco de dados, e nao criar uma classe BancoDados

minha pergunta é:
neste caso, qual seria a melhor estruturação das classes?
alguma das 2 maneiras que citei, ou outra?

grato

Julio Romano[/quote]

Fala romano…

Não é uma boa você ter uma classe mãe responsável por abrir e fechar as conexões. O ideal é você ter uma classe que te retorne apenas uma instância do objeto Connection pré-configurada. Dê uma olhada no design pattern Singleton.

A sua classe Agenda teria que ser um DAO, que tem a responsabilidade de isolar todo acesso a dados (operações CRUD, etc…).

Segue alguns links que podem te ajudar:

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

bom, fiz assim:

Pessoa.class:

package agenda;

public class Pessoa {
	private String nome;
	private String telefone;
	private String email;
	
	public Pessoa(String nome,String telefone,String email){
		this.nome = nome;
		this.telefone = telefone;
		this.email = email;
	}
	
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
}

BancoDados.class:

package agenda;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class BancoDados {
	private static BancoDados instancia;
	private Connection connection;

	private BancoDados() {
		System.out.println("aasasas");
		try {
			Properties p = new Properties(  );
			p.put("user", "root");
			p.put("password", "");
			p.put("useUnicode", "true");
			p.put("characterEncoding", "UTF-8");
			//conecta
			String driverName = "org.gjt.mm.mysql.Driver";
			Class.forName(driverName);
			String serverName="localhost";
			String dataBase="agenda";
			String url = "jdbc:mysql://" + serverName + "/" + dataBase;
			connection = DriverManager.getConnection(url, p);
		} catch (ClassNotFoundException e) {
			System.out.println("O driver expecificado não foi encontrado."); 
		} catch (SQLException e) {
			System.out.println("Não foi possível conectar ao Banco de Dados"); 
		}
	}
	public synchronized static BancoDados getInstance(){
		if(instancia == null)
			instancia = new BancoDados();
		return instancia;
	}
	public Connection getConnection(){
		return connection;
	}
	public void desconecta(Connection con){
		if(con!=null){
			try {
				con.close();
			} catch (SQLException e) {
				System.out.println("Nenhuma conexão ao banco de dados estava aberta."); 
			}
		}
	}
}

Agenda.class:

package agenda;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class Agenda {
	BancoDados bd = BancoDados.getInstance();
	private ArrayList<Pessoa> contatos=new ArrayList<Pessoa>();
	
	public ArrayList<Pessoa> buscaContatos(){
		try {
			Statement stm = bd.getConnection().createStatement();
			String query = "select * from contatos";
			ResultSet rs = stm.executeQuery(query);
			while(rs.next())
				contatos.add(new Pessoa(rs.getString("nome"),rs.getString("fone"),rs.getString("email")));
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
		return contatos;
	}
}

seria assim mesmo?
ou eu nao entendi direito?

grato pela atençao

Romano, desse jeito tá legal… tem algumas coisas para modificar, mas só aumentaria a complexidade. Mantenha o foco nesse modelo e com o tempo você poderá ir adicionando outras coisas.