El patrón **Repository** actúa como un mediador entre las capas de dominio y de mapeo de datos. Proporciona una interfaz que se comporta como una colección de objetos en memoria.
Su objetivo es ocultar los detalles de la infraestructura de persistencia (SQL, NoSQL, APIs externas) y permitir que la lógica de negocio trabaje con objetos de dominio simples.
# Diferencia con DAO
Mientras que un **DAO** (Data Access Object) suele ser una abstracción directa sobre una tabla de la base de datos, un **Repository** es una abstracción de más alto nivel orientada al dominio. Puede utilizar varios DAOs internamente para reconstruir un objeto complejo (Agregado).
# Implementación Común
public interface CustomerRepository {
void add(Customer customer);
void remove(Customer customer);
Customer findById(String id);
List<Customer> findByStatus(Status status);
}