J'essaye de trouver un bon design pour convertir un ensemble d'objets différents en un objet commun. Fondamentalement, je reçois un objet complexe (de plusieurs légèrement différent) du système A, et dois le convertir en un objet plus simple pour le système B.Conception pour convertir des objets
Les objets dont je convertis tous héritent de la même classe de base, donc partie de la conversion est toujours le même. Mais dans tous les cas, la conversion implique quelque chose de très spécifique au type d'objet que je convertis. Cela peut être un RPC, un chargement HTTP, une recherche dans une base de données ou quelque chose de complètement différent. Je regarde les modèles Template method et Strategy. Mais ni l'un ni l'autre ne semble être un ajustement parfait. Le problème est que la méthode/stratégie à utiliser est liée au type d'objet converti et n'est donc pas interchangeable.
C'est une esquisse de ce que je pense à faire:
class FooConverter {
Map<String, FooConverter> converters;
Foo convert(Bar bar) {
Foo foo = ...; // Common part of the conversion.
FooConverter c = converters.get(bar.getType(), foo);
c.finishConversion(bar, foo);
return foo;
}
}
Ce qui me contrarie est que FooConverter
doit définir une méthode de conversion supplémentaire qui prend l'objet partiellement converti en paramètre. Donc je me retrouve avec un mélange de stratégie (puisque tous les convertisseurs implémentent la même interface) et de méthode de template (puisque la partie commune de la conversion est partagée par tout le convertisseur). Y a-t-il un meilleur moyen?
+1 Le motif du visiteur semble le mieux adapté ici. – skaffman
Le modèle de visiteur semble être le chemin à parcourir, merci! Comme je ne peux pas modifier les classes du système A, j'aurai besoin d'une sorte de wrapper pour Bar, mais ça ne devrait pas être trop mauvais. – albertb