L'héritage du contexte, comme le montre l'exemple Duck de Head First Design Patterns, n'est-il pas pertinent pour le modèle de stratégie?

10

Dans Head First Design Patterns, il enseigne le modèle de stratégie en utilisant un exemple Duck où différentes sous-classes de Duck peuvent être affectées à un comportement particulier lors de l'exécution. D'après ma compréhension, l'objectif du modèle de stratégie est de modifier le comportement d' un seul objet au moment de l'exécution, mais ils utilisent l'héritage de Duck pour modifier le comportement de divers types de Duck.

Modèle de stratégie

Pertinence?

L'héritage du contexte de Duck n'est-il pas pertinent pour le modèle de stratégie ou la variation des types de Duck et la variation de leurs comportements sont-elles une bonne raison d'utiliser le modèle de stratégie? Les situations dans lesquelles vous devez varier constituent-elles une bonne raison d'utiliser le modèle de stratégie? Pourquoi incluraient-ils cela comme exemple de modèle de stratégie?

Un exemple plus simple

Puis-je simplifier davantage cet exemple en ayant simplement une classe Duck (pas de classes dérivées)? Ensuite, lors de la mise en œuvre d'un objet canard, différents comportements peuvent lui être attribués en fonction de certaines circonstances qui ne dépendent pas de son propre type d'objet. Par exemple: les changements de FlyBehavior en fonction de la météo ou les changements de QuackBehavior en fonction de l'heure de la journée ou de la faim d'un canard. Je sais que cela résoudrait un problème différent de celui du livre, mais ce que je recherche, c'est un exemple de modèle de stratégie pertinent sur lequel s'appuyer.

Mon exemple ci-dessus constituerait-il également le modèle de stratégie?

Éditer:

J'ai réussi à trouver 2 exemples de modèles de stratégie plus simples qui adhèrent plus strictement à des modèles de stratégie sans héritage de contexte: Hunter.java et solver.py .

Korey Hinton
la source

Réponses:

7

Oui, je pense que vous êtes sur la bonne voie. La classe utilisant le modèle de stratégie ne doit pas être une sous-classe. Le modèle de stratégie est une alternative à l'héritage pour la réutilisation du code. Cela revient à la comparaison encore plus large de l'héritage par rapport à la composition.

De Design Patterns: Elements of Reusable OOP, vous utiliseriez un modèle de stratégie pour

  • Évitez une explosion de sous-classes (en raison de combinaisons de comportements)
  • Si vous devez remplacer le comportement au moment de l'exécution

Si vous avez utilisé l'héritage pour implémenter des comportements Quack et Fly, vous obtiendrez avec toutes ces sous-classes pour représenter toutes les combinaisons de comportements.

  • FlyableQuackableDuck
  • FlyableSqeakableDuck
  • FlyableMuteDuck
  • NoFlyQuackableDuck
  • NoFlySqueakableDuck
  • NoFlyMuteDuck

Le fait d'avoir autant de sous-classes le rend plus difficile à maintenir, c'est pourquoi le modèle de stratégie est privilégié dans ce cas. Vous avez juste besoin de deux propriétés qui encapsulent Flyability et Quackability et vous pouvez les mélanger et les assortir sans créer de nouvelles classes.

Vous avez également déjà mentionné l'avantage lié à l'exécution si la météo changeait, la propriété Fly du canard pourrait être remplacée par un objet NoFly en raison des conditions.

Cela est conforme aux conseils de privilégier la composition plutôt que l'héritage lorsque cela est possible.

Despertar
la source
1

Puis-je simplifier davantage cet exemple en ayant simplement une classe Duck (pas de classes dérivées)? Ensuite, lors de la mise en œuvre d'un objet canard, différents comportements peuvent lui être attribués en fonction de certaines circonstances qui ne dépendent pas de son propre type d'objet.

Certainement. Pour trouver l'inspiration, jetez un œil à Head First Object-Oriented Analysis and Design . Il y a une "Rick's Guitars" montrant une explosion de sous-classes d' instruments (musicaux) . Pour y remédier, tout ce comportement variable est enveloppé dans une classe de "spécification", en respectant le principe d' encapsuler ce qui varie .

Abstract Factory - Construction basée sur le contexte

Voici le schéma . BTW, notez qu'il utilise la stratégie elle-même.

Se concentrer sur le concept, pas sur la mise en œuvre ... Vous pourriez avoir une "WeatherFactory" qui construit des objets de spécification basés sur des conditions ensoleillées ou pluvieuses, etc.

Vous pourriez avoir des "usines d'usines" pour construire ces trucs "NoFlyInFogQuackableMallard". Et en effet, c'est de cela qu'il s'agit avec le modèle de l'usine abstraite. Donc peut-être un DuckFactory pour faire des types de canards généraux, puis un WeatherFactory pour lui donner un comportement de temps brumeux spécifique au type de canard.

radarbob
la source