Tengo una clase llamada GoogleWeather, quiero convertirla a otra clase CustomWeather.Patrón de diseño para convertir una clase a otra
¿Hay algún patrón de diseño que te ayude a convertir las clases?
Tengo una clase llamada GoogleWeather, quiero convertirla a otra clase CustomWeather.Patrón de diseño para convertir una clase a otra
¿Hay algún patrón de diseño que te ayude a convertir las clases?
Hay una decisión crítica para hacer:
¿Necesita el objeto que se genera por la conversión para reflejar los cambios futuros en el objeto de origen?
Si no necesita tal funcionalidad, entonces el enfoque más simple es usar una clase de utilidad con métodos estáticos que crean un nuevo objeto basado en los campos del objeto fuente, como se menciona en otras respuestas.
Por otro lado, si usted necesita el objeto convertido para reflejar los cambios en el objeto de origen, probablemente tendría algo en la línea de la Adapter design pattern:
public class GoogleWeather {
...
public int getTemperatureCelcius() {
...
}
...
}
public interface CustomWeather {
...
public int getTemperatureKelvin();
...
}
public class GoogleWeatherAdapter implements CustomWeather {
private GoogleWeather weather;
...
public int getTemperatureKelvin() {
return this.weather.getTemperatureCelcius + 273;
}
...
}
No entendí la diferencia entre el adaptador y el appperche del asignador cuál es la ventaja de usar el patrón de adaptador en este caso? – user1549004
@ user1549004: el adaptador es un contenedor: todos los métodos se envían al objeto de origen. Eso significa que cualquier actualización del objeto fuente se propaga a través del adaptador. Por otro lado, el uso de una clase de mapeador es algo que ocurre una única vez: cualquier actualización de la fuente generalmente no afectará el resultado de la conversión. – thkala
¿podría darme un ejemplo al usar una clase mapper en el caso de que las actualizaciones de la fuente no afecten el resultado de la conversión? – user1549004
En ese caso, me gustaría utilizar una clase Mapper con un montón de métodos estáticos:
public final class Mapper {
public static GoogleWeather from(CustomWeather customWeather) {
GoogleWeather weather = new GoogleWeather();
// set the properties based on customWeather
return weather;
}
public static CustomWeather from(GoogleWeather googleWeather) {
CustomWeather weather = new CustomWeather();
// set the properties based on googleWeather
return weather;
}
}
Así que no tienen dependencias entre las clases.
Ejemplo de uso:
CustomWeather weather = Mapper.from(getGoogleWeather());
¿es un buen enfoque trabajar con Mapper? – user1549004
¡De causa, es ** el mejor enfoque de todos los tiempos **! (Es una broma, pero bueno, no recomendaría malas soluciones aquí) –
Algo que debe tenerse en cuenta: esta es una conversión de una sola vez; los cambios futuros en el objeto fuente no afectarán los campos del objeto resultante. – thkala
Además, También puede utilizar las nuevas Java8 función 'Función' de java.util.function '.
Se proporciona una explicación más detallada en http://www.leveluplunch.com/java/tutorials/016-transform-object-class-into-another-type-java8/. Amablemente echa un vistazo!
esto es solo un convertidor unidireccional simple - válido pero puede implementarlo exactamente de la misma manera en cualquier versión de Java. –
Decorator pattern? – assylias
¿Cuál es su jerarquía (hace CustomWeather extiende GoogleWeather)? ¿Qué quiere decir con "convertir"? – Flawyte
Convertir como en ¿cómo? ¿Crear una subclase, cambiarle el nombre, etc.? No está claro lo que desea en la clase "CustomWeather" – russ36363