Patrón de Diseño Adaptador para Transformar Datos en Clases Java
Clase 17 de 32 • Curso de Patrones de Diseño en Android
Resumen
¿Qué es un patrón de diseño y cómo funciona un adaptador?
La programación y el desarrollo de software están llenos de patrones de diseño que nos ayudan a crear mejores aplicaciones. Uno de estos patrones es el adaptador, el cual funciona como un mediador entre dos clases que, por sí solas, no se entienden. A menudo, esto se aplica cuando una clase o sistema recibe datos de una fuente externa, como podría ser una API, y no todos esos datos son necesarios para la aplicación en cuestión. Aquí es donde el adaptador juega un papel crucial: traduce y simplifica esos datos para que la clase receptora pueda manejarlos de manera más eficiente.
¿Por qué usar un adaptador?
La necesidad de un adaptador surge cuando dos entidades no pueden comunicarse directamente debido a sus incompatibilidades. El adaptador sirve como un traductor entre estas entidades, permitiendo que la comunicación fluya de manera eficiente sin requerir cambios significativos en ambas partes.
- Ventajas del uso del adaptador:
- Simplifica la estructura de la aplicación al separar la lógica de negocio del manejo de datos.
- Facilita el mantenimiento, ya que las modificaciones se concentran en un solo lugar.
- Proporciona flexibilidad para gestionar cambios en el proveedor de datos externo sin afectar a la vista o la lógica de la aplicación.
¿Cómo implementar un adaptador en Kotlin?
Veamos un ejemplo práctico de cómo implementar un adaptador en Kotlin. Empezamos por crear una clase de datos que simula una respuesta de una API, luego creamos un adaptador que customize esta información para una vista de usuarios.
data class GitUserResponse(
val id: String,
val doc: String,
val userPhotoUrl: String
)
En el ejemplo anterior, la clase GitUserResponse
representa la estructura de datos que recibimos del sistema externo. Ahora creamos un adaptador que procesa esta información.
class UserAdapter(private val gitUserResponse: GitUserResponse) {
fun toViewModel(): UserViewModel {
return UserViewModel(
userName = gitUserResponse.id,
userPhoto = gitUserResponse.userPhotoUrl
)
}
}
data class UserViewModel(
val userName: String,
val userPhoto: String
)
- Detalles importantes:
- La clase
UserAdapter
traduceGitUserResponse
en unUserViewModel
, que es más adecuado para la vista da la aplicación. UserViewModel
incluye solo los datos necesarios: el nombre de usuario y la URL de la foto del usuario.
- La clase
¿Cómo manejar cambios en las respuestas?
Un caso común es cuando las respuestas de una API cambian y comienzan a devolver datos bajo diferentes nombres. En lugar de cambiar todas las vistas directamente, solo se debe ajustar el adaptador, lo que minimiza el impacto.
class UserAdapter(private val gitUserResponse: GitUserResponse) {
fun toViewModel(): UserViewModel {
return UserViewModel(
userName = gitUserResponse.doc, // Cambio en la fuente de datos
userPhoto = gitUserResponse.userPhotoUrl
)
}
}
Con este enfoque:
- Adaptabilidad: Solo el adaptador requiere ajustes frente a cambios en el proveedor de datos.
- Consistencia: La vista y el presentador no se ven afectados, dando estabilidad al sistema.
- Escalabilidad: Se puede utilizar el mismo patrón para otros tipos de datos o vistas, facilitando la extensión del proyecto.
El adaptador, por lo tanto, se convierte en una herramienta fundamental en el desarrollo de aplicaciones modernas, facilitando la integración y eficiencia de las soluciones. Continúa explorando y experimentando con patrones de diseño para enriquecer tus proyectos. ¡El aprendizaje nunca se detiene!