Question

Comment ça marche, à quoi ça sert et quand faut-il l’utiliser?

Était-ce utile?

La solution

Expliquons le modèle de stratégie facilement:

Vous avez une classe Car () avec une méthode run () , de sorte que vous l'utilisez de cette manière dans un pseudo langage:

mycar = new Car()
mycar.run()

Maintenant, vous pouvez vouloir changer le comportement de run () à la volée, pendant l'exécution du programme. Par exemple, vous pouvez simuler une panne de moteur ou l’utilisation d’un "boost". bouton dans un jeu vidéo.

Il existe plusieurs façons de faire cette simulation: utiliser des instructions conditionnelles et une variable flag est un moyen. Le modèle de stratégie en est un autre: il délègue le comportement de la méthode run () à une autre classe:

Class Car()
{
    this.motor = new Motor(this) 

    // passing "this" is important for the motor so it knows what it is running

    method run()
    {
        this.motor.run()
    }

    method changeMotor(motor)
    {
        this.motor = motor 
    }

}

Si vous souhaitez modifier le comportement de la voiture, vous pouvez simplement changer le moteur. (Plus facile dans un programme que dans la vraie vie, non? ;-))

C’est très utile si vous avez beaucoup d’états complexes: vous pouvez les modifier et les maintenir beaucoup plus facilement.

Autres conseils

Problème

Le modèle de stratégie est utilisé pour résoudre des problèmes qui pourraient être (ou sont prévus) être mis en œuvre ou résolus par différentes stratégies et qui possèdent une interface clairement définie pour de tels cas. Chaque stratégie est parfaitement valide en soi, certaines stratégies étant préférables dans certaines situations, permettant à l’application de basculer entre elles lors de l’exécution.

Exemple de code

namespace StrategyPatterns
{
  // Interface definition for a Sort algorithm
  public interface ISort
  {
    void Sort(List<string> list)
  }

  // QuickSort implementation
  public class CQuickSorter : ISort
  {
    void Sort(List<string> list)
    {
      // Here will be the actual implementation
    }
  }

  // BubbleSort implementation
  public class CBubbleSort : ISort
  {
    void Sort(List<string> list)
    {
      // The actual implementation of the sort
    }
  }

  // MergeSort implementation
  public class CMergeSort : ISort
  {
    void Sort(List<string> list)
    {
      // Again the real implementation comes here
    }
  }

  public class Context
  {
    private ISort sorter;

    public Context(ISort sorter)
    {
      // We pass to the context the strategy to use
      this.sorter = sorter;
    }

    public ISort Sorter
    {
      get{return sorter;)
    }
  }

  public class MainClass
  {
    static void Main()
    {
       List<string> myList = new List<string>();

       myList.Add("Hello world");
       myList.Add("Another item");
       myList.Add("Item item");

       Context cn = new Context(new CQuickSorter());
       // Sort using the QuickSort strategy
       cn.Sorter.Sort(myList);
       myList.Add("This one goes for the mergesort");
       cn = new Context(new CMergeSort());
       // Sort using the merge sort strategy
       cn.Sorter.Sort(myList);
    }
  }
}
  • Qu'est-ce qu'une stratégie? Une stratégie est un plan d'action conçu pour atteindre un objectif spécifique;
  • & # 8220; Définissez une famille d’algorithmes, encapsulez-les et rendez-les interchangeables. La stratégie permet à l’algorithme de varier indépendamment des clients qui l’utilisent. & # 8221; (Gang of Four);
  • Spécifie un ensemble de classes, chacune représentant un comportement potentiel. La commutation entre ces classes modifie le comportement de l'application. (la stratégie);
  • Ce comportement peut être sélectionné au moment de l'exécution (à l'aide d'un polymorphisme) ou au moment de la conception.
  • Capturez l'abstraction dans une interface, enterrez les détails de l'implémentation dans des classes dérivées;

entrer la description de l'image ici

  • Une alternative à la stratégie consiste à modifier le comportement de l'application à l'aide d'une logique conditionnelle. (BAD);
  • L’utilisation de ce modèle facilite l’ajout ou la suppression de comportements spécifiques, sans avoir à recoder et à retester tout ou partie de l’application;

  • Bonnes utilisations:

    • Lorsque nous avons un ensemble d'algorithmes similaires et qu'il est nécessaire de basculer entre eux dans différentes parties de l'application. Avec Strategy, il est possible d'éviter les ifs et de faciliter la maintenance;
    • Lorsque nous souhaitons ajouter de nouvelles méthodes à la superclasse qui n’ont pas nécessairement de sens pour chaque sous-classe. Au lieu d'utiliser une interface de manière traditionnelle, en ajoutant la nouvelle méthode, nous utilisons une variable d'instance qui est une sous-classe de la nouvelle interface Functionality. C’est ce que l’on appelle la composition: au lieu d’hériter une capacité par héritage, la classe est composée d’objets ayant la bonne capacité;

Un motif étroitement lié est le motif Délégué; dans les deux cas, une partie du travail est passée à un autre composant. Si je comprends bien, la différence entre ces modèles est la suivante (et corrigez-moi si je me trompe):

  • Dans le modèle Délégué , le délégué est instancié par la classe englobante (délégante); Cela permet la réutilisation du code par composition plutôt que par héritage. La classe englobante peut connaître le type concret du délégué, par exemple: si elle appelle son constructeur lui-même (par opposition à une usine).

  • Dans le modèle Stratégie , le composant qui exécute la stratégie est une dépendance fournie au composant englobant (en utilisant) via son constructeur ou un paramètre (en fonction de votre religion). Le composant using ignore totalement quelle stratégie est utilisée; la stratégie est toujours invoquée via une interface.

Quelqu'un connaît-il d'autres différences?

Directement de article de Wikipedia relatif au modèle de stratégie :

  

Le modèle de stratégie est utile dans les cas où il est nécessaire d’échanger dynamiquement les algorithmes utilisés dans une application. Le modèle de stratégie vise à fournir un moyen de définir une famille d’algorithmes, d’encapsuler chacun d’eux en tant qu’objet et de les rendre interchangeables. Le modèle de stratégie permet aux algorithmes de varier indépendamment des clients qui les utilisent.

Pour ajouter aux réponses déjà magnifiques: Le modèle de stratégie présente une forte similitude avec le transfert d’une fonction (ou de plusieurs fonctions) à une autre fonction. Dans la stratégie, cela se fait en encapsulant ladite fonction dans un objet, puis en le faisant passer. Certaines langues peuvent passer des fonctions directement, elles n'ont donc pas besoin du modèle. Mais d'autres langues ne peuvent pas transmettre de fonctions, mais peuvent transmettre des objets; le motif s’applique alors.

Surtout dans les langages de type Java, vous constaterez que le type zoo du langage est assez petit et que votre seul moyen de l'étendre est de créer des objets. Par conséquent, la plupart des solutions aux problèmes consistent à trouver un modèle; un moyen de composer des objets pour atteindre un objectif spécifique. Les langues avec des zoos de types plus riches ont souvent des moyens plus simples de résoudre les problèmes - mais les types plus riches signifient également que vous devez passer plus de temps à apprendre le système de types. Les langues avec une discipline de frappe dynamique ont souvent une approche sournoise du problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top