Además del patrón DTO (Data Transfer Object), existen otros conceptos fundamentales que ayudan a estructurar aplicaciones Java de forma limpia y escalable.
🧩 Tabla de conceptos
Concepto | Descripción |
---|---|
POJO (Plain Old Java Object) | Clase Java simple sin dependencias externas ni lógica compleja. Los DTO suelen ser POJOs. |
VO (View Object) | Representa los datos que se muestran en la interfaz de usuario. Puede derivarse de un DTO. |
DO (Domain Object) | Modelo que representa entidades del negocio. Contiene lógica relacionada con el dominio. |
PO (Persistent Object) | Objeto que refleja directamente una tabla en la base de datos. Se usa en la capa de persistencia. |
BO (Business Object) | Encapsula lógica de negocio. Puede interactuar con DOs y coordinar procesos. |
DAO (Data Access Object) | Patrón que abstrae el acceso a la base de datos. Se encarga de operaciones CRUD sobre los POs. |
🔄 Relación entre los conceptos
- El DAO accede a la base de datos y devuelve un PO.
- El BO usa el PO para aplicar lógica de negocio.
- El resultado se transforma en un DTO para enviarlo a otra capa.
- Finalmente, el DTO puede convertirse en un VO para mostrarlo en la interfaz.
Este flujo permite mantener una arquitectura desacoplada, modular y fácil de mantener.
Ejemplos de código en Java
1. POJO (Plain Old Java Object)
public class Usuario {
private String nombre;
private int edad;
public Usuario() {}
public Usuario(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
public String getNombre() { return nombre; }
public void setNombre(String nombre) { this.nombre = nombre; }
public int getEdad() { return edad; }
public void setEdad(int edad) { this.edad = edad; }
}
2. VO (View Object)
public class UsuarioVO {
private String nombreCompleto;
private String mensajeBienvenida;
public UsuarioVO(String nombreCompleto) {
this.nombreCompleto = nombreCompleto;
this.mensajeBienvenida = "Bienvenido, " + nombreCompleto;
}
public String getNombreCompleto() { return nombreCompleto; }
public String getMensajeBienvenida() { return mensajeBienvenida; }
}
3. DO (Domain Object)
public class Producto {
private Long id;
private String nombre;
private double precio;
public Producto(Long id, String nombre, double precio) {
this.id = id;
this.nombre = nombre;
this.precio = precio;
}
// Getters y setters omitidos por brevedad
}
4. PO (Persistent Object)
@Entity
@Table(name = "productos")
public class ProductoPO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "nombre")
private String nombre;
@Column(name = "precio")
private double precio;
// Getters y setters
}
5. BO (Business Object)
public class ProductoBO {
private ProductoDAO productoDAO = new ProductoDAO();
public double calcularDescuento(Long productoId) {
ProductoPO producto = productoDAO.obtenerPorId(productoId);
return producto.getPrecio() * 0.9; // 10% de descuento
}
}
6. DAO (Data Access Object)
public class ProductoDAO {
public ProductoPO obtenerPorId(Long id) {
// Simulación de acceso a base de datos
return new ProductoPO(id, "Ejemplo", 100.0);
}
public void guardar(ProductoPO producto) {
// Simulación de persistencia
System.out.println("Producto guardado: " + producto.getNombre());
}
}
Estos ejemplos ilustran cómo se separan responsabilidades en una arquitectura Java bien estructurada. Puedes combinarlos para construir aplicaciones limpias, escalables y fáciles de mantener.