Quelle est la différence entre le modèle de conception de la stratégie et le modèle de conception de L'État?
Quelles sont les différences entre la Stratégie de conception motif et la conception de l'État, modèle? J'ai parcouru quelques articles sur le web, mais ne pouvais pas faire clairement la différence.
est-ce que quelqu'un peut expliquer la différence en termes profanes?
16 réponses
honnêtement, les deux modèles sont assez similaires dans la pratique, et la différence déterminante entre eux tend à varier en fonction de qui vous demandez. Certains choix populaires sont:
- les États stocker une référence à l'objet de contexte qui les contient. Les stratégies ne sont pas. Les États
- sont autorisés à se remplacer (C'est-à-dire à changer l'état de l'objet contextuel en quelque chose d'autre), alors que les stratégies ne le sont pas.
- Les stratégies sont passées à l'objet contextuel comme paramètres, tandis que les États sont créés par l'objet contextuel lui-même. Les stratégies
- ne traitent qu'une seule tâche spécifique, tandis que les États fournissent l'implémentation sous-jacente pour tout (ou presque tout) ce que fait l'objet contextuel.
Un "classique" de la mise en œuvre concordance de l'État ou d'une Stratégie pour chaque élément de la liste, mais vous courez à travers des hybrides qui sont des mélanges des deux. Si un l'une est plus L'État - Y ou la Stratégie-y est finalement une question subjective.
le modèle de stratégie est vraiment d'avoir une mise en œuvre différente qui accomplit (essentiellement) la même chose, de sorte qu'une mise en œuvre peut remplacer l'autre comme la stratégie exige. Par exemple, vous pourriez avoir différents algorithmes de tri dans un modèle de stratégie. Les appelants à l'objet ne change pas en fonction de quelle stratégie est employé, mais indépendamment de la stratégie, le but est le même (trier la collection).
le modèle D'État est d'environ faire des choses différentes en fonction de l'état, tout en laissant l'appelant soulagé du fardeau d'accommoder tous les états possibles. Ainsi, par exemple, vous pourriez avoir une méthode getStatus()
qui renverra différents statuts basés sur l'état de l'objet, mais l'appelant de la méthode n'a pas besoin d'être codé différemment pour tenir compte de chaque État potentiel.
la différence réside simplement dans le fait qu'ils résolvent des problèmes différents:
- le État modèle traite de ce que (état ou type) un objet est (in) -- il encapsule un comportement dépendant de l'État, tandis que
- le stratégie modèle traite de comment un objet exécute une certaine tâche -- il encapsule un algorithme.
les concepts utilisés pour atteindre ces différents objectifs sont toutefois très similaires; ces deux modèles sont des exemples de composition avec délégation.
quelques observations sur leurs avantages:
en utilisant le État motif la classe state-holding (context) est libérée de la connaissance de quel état ou type il est et ce qui les types qui sont disponibles. Cela signifie que la classe respecte le principe de conception ouverte-fermée (open-closed design principle-OCP): la classe est fermée pour des changements dans quels états/types il y a, mais les États/types sont ouverts à des extensions.
en utilisant le stratégie pattern la classe algorithme-using (context) est libérée de la connaissance de comment pour effectuer une certaine tâche (-- l' "algorithme"). Ce cas crée également une adhésion à L'OCP; la classe est fermé pour les changements concernant la façon d'effectuer cette tâche, mais le design est très ouvert à des ajouts d'autres algorithmes pour résoudre cette tâche.
Cela améliore probablement aussi l'adhésion de la classe de contexte au principe de responsabilité unique (PRS). De plus, l'algorithme devient facilement disponible pour être réutilisé par d'autres classes.
quelqu'un Peut-il expliquer en termes simples?
modèles de Conception ne sont pas vraiment "profane" des concepts, mais je vais essayer de la rendre aussi claire que possible. N'importe quel dessin peut être considéré en trois dimensions:
- Le problème le modèle résout;
- la structure statique du dessin (diagramme de classe);
- La dynamique du modèle (diagrammes de séquence).
comparons L'état et la stratégie.
Problème le modèle résout
État est utilisé dans un de deux cas [GoF livre p. 306] :
- le comportement d'un objet dépend de son état, et il doit changer son comportement à l'exécution en fonction de cet état.
- opérations ont de grandes, multipart déclarations conditionnelles qui dépendent de la de l'objet d'état. Cet état est généralement représenté par un ou plusieurs énumérés constant. Souvent, plusieurs opérations contiendront cette même structure conditionnelle. L'État modèle met chaque branche du conditionnel dans une catégorie distincte. Cela vous permet de traiter l'état de l'objet comme un objet à part entière qui peut varier indépendamment des autres objets.
Si vous voulez vous assurer que vous avez en effet la problème le modèle D'État résout, vous devriez être en mesure de modéliser les états de l'objet en utilisant une machine d'état fini . Vous pouvez trouver un exemple appliqué ici .
chaque transition d'état est une méthode dans l'interface D'État. Cela implique que pour un design, vous devez être assez sûr des transitions d'état avant d'appliquer ce modèle. Sinon, si vous ajoutez ou supprimez des transitions, il faudra changer l'interface et toutes les classes qui l'implémentent.
personnellement, je n'ai pas trouvé ce modèle si utile. Vous pouvez toujours mettre en œuvre des machines d'état finis en utilisant une table de recherche (ce n'est pas une façon OO, mais cela fonctionne assez bien).
Stratégie est utilisé pour la suite de [GoF livre p. 316] :
- de nombreuses classes apparentées ne diffèrent que par leur comportement. Les stratégies de fournir un moyen de configurer une classe de l'un des nombreux comportements.
- vous avez besoin de différentes variantes d'un algorithme. Par exemple, vous pouvez définir des algorithmes reflétant différents compromis espace/temps. Les stratégies peuvent être utilisées lorsque ces variantes sont mises en œuvre sous la forme d'une hiérarchie de classe d'algorithmes [HO87].
- un algorithme utilise des données que les clients ne devraient pas connaître. Utilisez le schéma de stratégie pour éviter d'exposer des structures de données complexes, spécifiques à un algorithme.
- une classe définit de nombreux comportements, et ceux-ci apparaissent comme des énoncés conditionnels multiples dans ses opérations. Au lieu de nombreuses conditions, déplacer les branches conditionnelles connexes dans leur propre classe de stratégie.
le dernier cas où appliquer la stratégie est lié à un remaniement connu sous le nom de remplacer conditionnel avec polymorphisme .
résumé: L'état et la stratégie résolvent des problèmes très différents. Si votre problème ne peut pas être modélisé avec une machine d'état fini, alors probablement le modèle D'État n'est pas approprié. Si votre problème n'est pas d'encapsuler des variantes d'un algorithme complexe, alors la stratégie ne s'applique pas.
structure Statique du modèle
L'État a la structure de classe UML suivante:
Stratégie a la suite de classes UML de la structure:
résumé: en termes de structure statique, ces deux modèles sont essentiellement identiques. En fait, les outils de détection de modèle tels que celui-ci considèrent que " la structure de la [...] les modèles est identique, leur interdisant l' distinction par un procédé automatique (par exemple, sans en référer pour informations conceptuelles). "
il peut y avoir une différence majeure, cependant, si les États concrets décident eux-mêmes des transitions d'état (voir les associations " " dans le schéma ci-dessus). Il en résulte un couplage entre les États du béton. Par exemple (voir la section suivante), l'État a détermine la transition vers L'état B. Si la classe de contexte décide de la transition vers le prochain état concret, ces dépendances en aller.
la Dynamique du modèle
comme mentionné dans la section de problème ci-dessus, État implique que le comportement change à l'exécution en fonction de certains état d'un objet. Par conséquent, la notion d'état transition s'applique, comme discuté avec la relation de la machine à état fini . [GoF] mentionne que les transitions peuvent soit être défini dans les sous-classes "ConcreteState", soit dans un emplacement centralisé (tel qu'un emplacement basé sur une table).
supposons une simple machine d'état fini:
en supposant que les sous-classes décident de la transition d'état( en retournant l'objet d'état suivant), la dynamique ressemble à quelque chose comme ceci:
pour montrer le dynamique de stratégie , il est utile d'emprunter un exemple réel .
résumé : chaque motif utilise un appel polymorphe pour faire quelque chose selon le contexte. Dans le patron D'État, l'appel polymorphe (transition) provoque souvent un changement dans le prochain état . Dans le patron de stratégie, l'appel polymorphe ne généralement changer le contexte (par exemple, payer par carte de crédit Une fois n'implique pas que vous payerez par PayPal La prochaine fois). Encore une fois, la dynamique du modèle D'État est déterminée par sa machine d'état fininte correspondante, qui (pour moi) est essentielle pour une application correcte de ce modèle.
la stratégie consiste à déplacer l'implémentation d'un algorithme d'une classe d'hébergement et de le placer dans une classe séparée. Cela signifie que la classe hôte n'a pas besoin de fournir l'implémentation de chaque algorithme lui-même, ce qui est susceptible de conduire à un code impur.
les algorithmes de tri sont généralement utilisés comme un exemple car ils font tous le même genre de chose (sort). Si chaque algorithme de tri différent est mis dans sa propre classe, alors le client peut facilement choisir l'algorithme à utiliser et le modèle fournit un moyen facile d'y accéder.
L'État de Modèle consiste à modifier le comportement d'un objet lorsque l'état de l'objet change. Cela signifie que la classe hôte n'a pas fourni la mise en œuvre du comportement pour tous les différents états dans lesquels elle peut être. La classe host encapsule habituellement une classe qui fournit la fonctionnalité requise dans un État donné, et passe à une classe différente lorsque la les changements d'état.
stratégie représente les objets qui "font" quelque chose, avec le même début et les résultats finaux, mais à l'interne en utilisant des méthodologies différentes. En ce sens, ils sont analogues à représenter la mise en œuvre d'un verbe. Le modèle D'État OTOH utilise des objets qui" sont " quelque chose - l'état d'une opération. Alors qu'ils peuvent représenter des opérations sur ces données, ils sont plus analogue à la représentation d'un nom que d'un verbe, et sont adaptées à l'état des machines.
stratégie: la stratégie est fixe et consiste généralement en plusieurs étapes. (Tri ne constitue qu'une étape et est donc un très mauvais exemple car il est trop primitif pour comprendre le but de ce modèle). Votre routine "principale" dans la stratégie appelle quelques méthodes abstraites. E. g. "Entrer dans la Salle de la Stratégie", "méthode" est goThroughDoor(), qui ressemble à: approachDoor(), si (verrouillé()) openLock(); openDoor(); enterRoom(); tourner(); closeDoor(); if (wasLocked()) lockDoor();
maintenant les sous-classes de cet "algorithme" général pour passer d'une pièce à une autre par une porte verrouillée possible peut mettre en œuvre les étapes de l'algorithme.
en d'autres termes, le fait de subdiviser la stratégie ne modifie pas les algorithmes de base, mais seulement les étapes individuelles.
que ci-dessus est un modèle de méthode de modèle. Maintenant, mettez les étapes appartenant ensemble (déverrouillage / verrouillage et ouverture / fermeture) dans leurs propres objets de mise en œuvre et délégué à eux. Par exemple: une serrure avec une clé et une serrure avec une carte de code sont deux types de serrures. Délègue de la stratégie aux objets" Step". Maintenant, vous avez un modèle de Stratégie.
un modèle D'État est quelque chose de complètement différent.
vous avez un objet enveloppant et l'objet enveloppé. Celui qui est enveloppé est"l'état". L'objet d'état n'est accessible que par son wrapper. Maintenant vous pouvez changer l'objet enveloppé à tout moment, ainsi l'emballage semble changer d'état, ou même sa "classe" ou de type.
E. G. vous avez un journal de service. Il accepte un nom d'utilisateur et un mot de passe. Il n'a qu'une méthode: logon(nom D'utilisateur de la chaîne, passwdHash de la chaîne). Au lieu de décider elle-même si une connexion est acceptée ou non, elle délègue la décision à un objet étatique. Cet objet d'état vérifie généralement simplement si la combinaison utilisateur/pass est valide et effectue une connexion. Mais maintenant vous pouvez échanger le "Checker" par un qui laisse seulement privilégié les utilisateurs se connectent (pendant le temps de maintanace par exemple) ou par un qui ne laisse personne se connecter. Que signifie le "checker" exprime le "journal sur l'état du système.
la différence la plus importante est que lorsque vous avez choisi une stratégie, vous vous y tenez jusqu'à ce que vous en ayez fini avec elle. Cela signifie que vous appelez sa "méthode principale" et tant que celle-ci est en cours d'exécution, vous ne changez jamais la stratégie. OTOH dans une situation de modèle d'état pendant l'exécution de votre système vous changez l'état arbitrairement que vous voyez l'ajustement.
envisager un système de réponse vocale Interactive (RVI) pour traiter les appels des clients. Vous pouvez le programmer pour gérer les clients sur:
- journées de travail
- Vacances
pour gérer cette situation, vous pouvez utiliser un motif D'État .
- Vacances : IVR a tout simplement répondu en disant que les appels ne peuvent être pris que les jours ouvrables entre 9h et 17h ".
- journées de travail : il répond en connectant le client à un responsable du service à la clientèle.
ce processus de connexion d'un client à un cadre de soutien peut lui-même être mis en œuvre en utilisant un schéma de stratégie où les cadres sont choisis sur la base de l'un ou l'autre des:
- Round Robin
- Le Moins Récemment Utilisé
- autres algorithmes fondés sur la priorité
le modèle de stratégie décide sur " comment " pour effectuer une action et le modèle d'État décide sur " quand " pour les exécuter.
stratégie le modèle est utilisé lorsque vous avez plusieurs algorithmes pour une tâche spécifique et que le client décide de l'implémentation réelle à utiliser à l'exécution.
UML diagramme de wiki Strategy pattern article:
caractéristiques clés:
- c'est un schéma comportemental.
- c'est basé sur la délégation.
- il change les viscères de l'objet en modifiant le comportement de la méthode.
- il est utilisé pour passer d'une famille d'algorithmes à une autre.
- Cela change le comportement de l'objet au moment de l'exécution.
faire référence à cet article pour plus d'informations et des exemples du monde réel:
Exemple Du Monde Réel du schéma stratégique
État le motif permet à un objet de modifier son comportement lorsque son état interne change
UML diagramme de wiki State pattern article:
Si nous devons changer le comportement d'un objet en fonction de son état, nous pouvons avoir un état variable dans L'objet et utilisez le bloc de condition if-else pour effectuer différentes actions basées sur l'état. État pattern est utilisé pour fournir une approche systématique et perdre couplé à la façon d'atteindre cet objectif par le biais de Contexte et État implémentations.
se Réfèrent à cette journaldev de l'article pour plus de détails.
les principales différences de sourcemaking and journaldev articles:
- la différence entre State et Strategy réside dans le délai de prescription. la stratégie est un schéma bind-once, tandis que L'État est plus dynamique .
- la différence entre L'État et la stratégie est dans l'intention. Avec la stratégie, le choix de l'algorithme est assez stable . avec L'État, un changement dans l'état de l'objet "context" l'amène à choisir dans sa "palette" D'objets stratégiques .
- Contexte contient de l'état comme instance de variable et il peut y avoir plusieurs tâches dont la mise en œuvre peut être dépendante de la état alors que dans stratégie pattern stratégie est passé comme argument à la méthode et context objet n'a aucune variable pour le stocker.
Dans un langage simple,
dans le schéma stratégique, il n'y a pas d'états ou tous ont le même état. Tout ce qu'on a, c'est des façons différentes d'accomplir une tâche, comme différents médecins traitent la même maladie d'un même patient avec le même état de différentes façons.
dans le modèle d'état, subjectivement Il ya des États, comme l'état actuel du patient (par exemple température élevée ou basse température), sur la base de laquelle la prochaine ligne de conduite (prescription de médicaments) sera décider.Et un état peut conduire à un autre État, donc il y a dépendance d'État à état( composition technique).
si nous essayons techniquement de le comprendre , basé sur une comparaison de code des deux, nous pourrions perdre la subjectivité de la situation,parce que les deux semblent très similaires.
les deux modèles délèguent à une classe de base qui a plusieurs dérivés, mais c'est seulement dans le modèle D'État que ces classes dérivées conservent une référence à la classe de contexte.
une autre façon de le regarder est que le modèle de stratégie est une version plus simple du modèle D'État; un sous-modèle, si vous voulez. Cela dépend vraiment si vous voulez que les États dérivés retiennent ou non les références au contexte (I. e: voulez-vous qu'ils appellent des méthodes sur le contexte).
pour plus d'informations: Robert C Martin (&Micah Martin) répondre à cette question dans leur livre, "Agile Principles, Patterns and Practices in C#". ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )
c'est une assez vieille question, mais quand même, je cherchais aussi les mêmes réponses et c'est ce que j'ai découvert.
pour le motif D'État permet de considérer un exemple de joueur médial bouton Play. Quand nous jouons, il commence à Jouer et rend le contexte conscient qu'il joue. Chaque fois que le client souhaite effectuer une opération de jouer, il vérifie l'état actuel du joueur. Maintenant le client sait que l'état de l'objet joue via l'objet contextuel alors il appelle la méthode des actions des objets de l'état de pause. La partie du client qui réalise l'état et sur quel état il doit agir peut être automatisée.
https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm
dans le cas D'un schéma de stratégie, la disposition du diagramme de classe est la même que celle du schéma d'état. Le client vient à cet arrangement pour faire une opération. C'est-à-dire qu'au lieu des différents états il y a différents algorithmes disent par exemple différentes analyses qui doivent être effectuées sur le modèle. Ici, les clients disent au contexte ce qu'il veut faire que quel algorithme (entreprise défini algorithme personnalisé) et puis effectue cela.
https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm
les deux instruments open close principe de sorte que le développeur a la capacité d'ajouter de nouveaux états au modèle d'état et nouvel algorithme.
mais la différence est ce qu'ils sont utilisés qui est le modèle d'état utilisé pour exécuter la logique différente basée sur un État de l'objet. Et dans un cas de stratégie logique différente.
L'État est livré avec un peu de dépendances dans les classes dérivées de l'état: comme un État sait que d'autres États viennent après lui. Par exemple, L'été vient après l'hiver pour n'importe quel état de saison, ou État de livraison après L'État de dépôt pour les achats.
, d'autre part, la Stratégie n'a pas de dépendances. Ici, tout type d'état peut être initialisé en fonction du type de programme/produit.
la différence est examinée dans http://c2.com/cgi/wiki?StrategyPattern . J'ai utilisé le schéma stratégique pour permettre le choix de différents algorithmes dans un cadre global d'analyse des données. Grâce à cela, vous pouvez ajouter des algorithmes sans avoir à changer les cadres globaux et sa logique.
un exemple typique est que vous avez un cadre pour optimiser une fonction. Le cadre définit les paramètres et données. Le stratégie pattern vous permet de sélectionner des algorithmes tels que les descentes sttepest, les gradients conjugués, les BFG, etc. sans modifier le cadre.
la stratégie et le modèle D'État ont la même structure. Si vous regardez le diagramme de classe UML pour les deux modèles, ils sont exactement identiques, mais leur intention est totalement différente. State design pattern est utilisé pour définir et gérer l'état d'un objet, tandis que Strategy pattern est utilisé pour définir un ensemble d'algorithme interchangeable et permet au client de choisir l'un d'eux. Ainsi, le modèle de stratégie est un modèle dirigé par le client tandis que L'objet peut gérer là-bas l'État lui-même.
en bref, avec le pattern de stratégie nous pouvons définir un certain comportement à la volée, avec le pattern d'état, nous pouvons être sûrs, qu'un objet va changer son comportement en interne avec le changement de son état.