Pregunta sobre Patrón de Diseño – Implementando el patrón DAO con Java Moderno.
Hemos heredado algún código en el que se implementa un patrón DAO de la siguiente manera:
interface DomainMapper<s, t=""> {
T mapObjectModel(S source);
}
public abstract class AbstractDao<source, target=""> implements DomainMapper<source, target=""> {
protected List<t> execute(SqlParameter params...) {
// Ejecuta alguna consulta
public S mapRow(ResultSet rs, int rowNum) {
// Realiza el mapeo
S source = super.mapRow(rs, rowNum);
T value = mapObjectModel(s);
}
}
}
public class SpecificDAO extends AbstractDAO<source, target=""> {
// Otras funciones
public Target mapObjectModel(Source s) {
// Implementación del mapeo aquí
}
}
Tenemos alrededor de 20 DAO implementados de manera similar.
Aquí está la pregunta:
- Hay un DAO específico que necesita algún tipo de estado para persistir entre llamadas. Es decir, entre cada llamada a
mapObjectModel()
con la fuente, necesito almacenar algún valor que utilizaré en la siguiente llamada. Por ejemplo, imaginemos una relación Padre – Hijo, elmapObjectModel
se llamará para cada hijo con el Padre y quiero crear un gráfico de objetos algo como esto:
public class Parent {
private List<child> children;
}
Entonces, quiero crear un “contexto” al que pueda referirme en la siguiente llamada y obtener el Padre y agregarle hijos.
¿Cuál es la mejor y más fácil manera de actualizar mapObjectModel()
para llevar información de estado entre llamadas y con cambios mínimos en los DAO existentes?
¿Existe un patrón que pueda resolver este problema por mí?
Gracias.
EDITAR:
Quiero poder guardar algún contexto entre cada llamada a mapObjectModel
.
La base de datos devolverá algo como esto:
Padre Hijo
1 1
1 2
Lo que mi SpecificDAO debería devolver es un objeto de tipo Parent con una lista de hijos, por lo que cada vez que se llama a mapObjectModel
con cada fila, quiero saber si ya tengo creado el objeto Parent, en cuyo caso puedo seguir añadiendo hijos.</source,></source,></source,></s,>
davy.ai
Una posible solución para agregar información de estado entre las llamadas a
mapObjectModel()
es introducir el patrón de Objeto de Contexto.El patrón de Objeto de Contexto implica crear un objeto que puede contener información de estado y pasarlo como parámetro a cada método que necesite acceder al estado. En este caso, podemos crear un objeto
Context
que contenga la información de estado que necesitamos para nuestro DAO específico.Aquí tienes un ejemplo de implementación:
Con esta implementación, podemos crear un objeto
Context
antes de llamar a cualquiera de los métodos del DAO, y pasarlo a cada método. Cada llamada amapObjectModel()
puede entonces acceder a la información de estado en el objetoContext
y actualizarlo en consecuencia.Agregar el parámetro de
Context
aexecute()
ymapRow()
puede requerir una reestructuración del código existente del DAO, pero los cambios deberían ser mínimos. En general, esta implementación debería proporcionar una forma sencilla de persistir la información de estado entre las llamadas amapObjectModel()
sin modificaciones importantes al patrón de DAO existente.</source,></source,></source,>