1

Je travaille en AS3, mais je pense que cela pourrait être une question générale, donc je vais l'encadrer plus vaguement ...Chaîne à Statégie dans Motif Stratégie

J'utilise un fichier XML pour définir paramètres pour une classe particulière d'objet qui implémente le modèle de stratégie. Il y aura une grande variété d'objets, et cela fonctionne pour nous comme une solution conviviale pour personnaliser ces objets. Comme je ne peux que définir des chaînes dans le fichier XML, quelqu'un peut-il suggérer une façon ordonnée de prendre cette chaîne et de mettre en œuvre la bonne stratégie?

J'avais deux pensées initiales. Premièrement, passer la chaîne au constructeur de l'objet et avoir un Switch Case dans l'objet qui applique la bonne stratégie. Ensuite, placez le commutateur hors de la classe dans le contrôleur qui transmet ensuite la stratégie correcte au constructeur de l'objet. La seconde ressemble à la version nettoyeuse car la classe d'objets elle-même n'est pas affectée par mon implémentation spécifique. Mais aucun ne se sent tout à fait raison.

Des suggestions supplémentaires seraient appréciées!

Répondre

3

Vous souhaitez utiliser un modèle de conception d'usine pour sélectionner la classe appropriée en fonction d'une chaîne d'entrée. Une bonne application de cela est Registry, où les classes applicables "s'enregistrent" elles-mêmes avec une classe de registre singleton comme étant appropriée pour une certaine chaîne d'entrée; l'usine elle-même devient juste une recherche de la chaîne à la classe enregistrée. Une solution de repli doit être présente lorsqu'aucune classe n'est enregistrée pour la chaîne d'entrée demandée: soit une exception, soit une implémentation "par défaut" qui est utilisée quand aucune application spécifique n'est appliquée - cette dernière est une option douce , mais pas toujours applicable. Un problème inévitable avec le registre est, comment localiser toutes les classes d'intérêt et s'assurer qu'elles s'enregistrent elles-mêmes (ce qui est particulièrement intéressant pour les classes de plugin); les meilleures solutions à cela dépendent plutôt de la langue spécifique et malheureusement je ne suis pas sûr de ce que AS3 offre à cet égard (ou si vous êtes intéressé par une telle expansion dynamique). Un autre problème intéressant avec Registry est "conflicts": que se passe-t-il si plus d'une classe applicable est la bonne pour une certaine chaîne d'entrée? "Last to claim wins" est le plus simple, mais souvent trop simple; vous pouvez avoir chaque classe registre pour plusieurs chaînes d'entrée avec une certaine "priorité" ou "priorité", ou bien (pas vraiment intéressant sur les systèmes qui ne sont pas distribués, mais crucial pour les systèmes distribués ...) "balance de charge" entre tous "serveurs" applicables (round-robin ou de manière plus sophistiquée).

Vous remarquerez que ces solutions ressemblent à votre deuxième plus que la première, mais la différence principale est que, au lieu d'un commutateur rigide et cassant (OOP bete noire ;-), ils s'appuient sur des mappages flexibles De la chaîne à la classe (ou à la méthode de construction de classe, déléguer & c, en fonction des détails du langage d'implémentation - par exemple, en Java, vous pourriez avoir une interface StrategyConstructing, chaque classe de stratégie enregistrerait sa propre classe auxiliaire jusqu'au registre).

0

oui, alex a souligné la bonne façon ...

pour les détails de mise en œuvre, vous voudrez peut-être jeter un oeil à this post, qui traite d'un problème similaire ... ma réponse contient un exemple d'implémentation pour obtenir commencé avec ...

Je pense, vous devriez faire une chaîne < -> mapping d'instance, car cela est plus robuste ...la stratégie doit être sans état du point de vue de l'objet applicatif, recevoir toutes les entrées de cet objet ... de cette façon vous pouvez changer de stratégie à l'exécution, car il n'est pas évident de synchroniser les états de l'objet et de la stratégie en des points arbitraires d'exécution ...

greetz

back2dos

Questions connexes