design patterns - strategy - Modèle de stratégie V/S Pattern




pattern strategy java open classroom (4)

Je viens de rencontrer deux modèles.

  1. Modèle de stratégie

  2. Décorateur

Modèle de stratégie: -

Le modèle de stratégie donne plusieurs algorithmes qui peuvent être utilisés pour effectuer une opération ou une tâche particulière.

Motif décorateur: -

Le motif Décorateur ajoute une fonctionnalité au composant.

En fait, j'ai trouvé que Pattern Pattern et Decorator Pattern peuvent aussi être utilisés de façon interchangeable.

Voici le lien: - Quand et comment le modèle de stratégie peut-il être appliqué au lieu du modèle de décorateur?

Quelle est la différence entre un motif de stratégie et un motif de décorateur?

quand le patron de stratégie devrait-il être utilisé et quand le modèle de décorateur devrait être utilisé?

Expliquer la différence entre les deux avec le même exemple.


Cela se résume à ceci: Utilisez la stratégie pour choisir une fonctionnalité de base. Utilisez Decorator pour ajouter des fonctionnalités supplémentaires. La stratégie est le gâteau que nous fabriquons et Decorator est la jolie décoration que nous y ajoutons.


Decorator est d'ajouter des fonctionnalités supplémentaires à une instance d'une classe, de sorte qu'il est implémenté dynamiquement en exécution. Il s'agit d'un modèle d'extensions de comportement. En raison des conditions pratiques dans lesquelles le sous-classement est de retour. La stratégie est un modèle dans lequel différents objets Stratégie partagent la même fonction abstraite, l'objet de contexte concret peut être configuré au moment de l'exécution avec l'objet de stratégie concrète d'un ensemble de familles. Comme MVC, le contrôleur est un cas de rôle de stratégie, la vue restreint la structure des données de sortie, tandis que les contrôleurs seront différents au moment de l'exécution, ce qui modifiera dynamiquement les données de sortie de la vue.


Le modèle de stratégie vous permet de modifier l'implémentation de quelque chose utilisé lors de l'exécution.

Le motif décorateur vous permet d'augmenter (ou d'ajouter) des fonctionnalités existantes avec des fonctionnalités supplémentaires au moment de l'exécution.

La différence clé est dans le changement vs augmenter

Dans l'une des questions que vous avez lié à cela, il souligne également qu'avec le modèle de stratégie, le consommateur est conscient que les différentes options existent, alors qu'avec le modèle de décorateur, le consommateur ne serait pas conscient des fonctionnalités supplémentaires.

Par exemple, imaginez que vous écrivez quelque chose pour trier une collection d'éléments. Donc, vous écrivez une interface ISortingStrategy vous pouvez ensuite implémenter plusieurs stratégies de tri différentes BubbleSortStrategy , QuickSortStrategy , RadixSortStrategy , puis votre application, basée sur certains critères de la liste existante, choisit la stratégie la plus appropriée pour trier la liste. Par exemple, si la liste contient moins de 10 éléments, nous utiliserons RadixSortStrategy , si moins de 10 éléments ont été ajoutés à la liste depuis le dernier tri, nous utiliserons BubbleSortStrategy sinon nous utiliserons QuickSortStrategy .

Nous changeons le type de tri au moment de l'exécution (pour être plus efficace en fonction de certaines informations supplémentaires). C'est le modèle de stratégie.

Maintenant, imaginez que quelqu'un nous demande de fournir un journal de la fréquence à laquelle chaque algorithme de tri est utilisé pour faire un tri réel et de restreindre le tri aux administrateurs. Nous pouvons ajouter ces deux fonctionnalités en créant un décorateur qui ISortingStrategy toute ISortingStrategy . Nous pourrions créer un décorateur qui enregistre qu'il a été utilisé pour trier quelque chose et le type de la stratégie de tri décorée. Et nous pourrions ajouter un autre décorateur qui vérifie si l'utilisateur actuel était un administrateur avant d'appeler la stratégie de tri décorée.

Ici, nous ajoutons une nouvelle fonctionnalité de n'importe quelle stratégie de tri en utilisant le décorateur, mais nous n'échangeons pas la fonctionnalité de tri de base (nous avons utilisé les différentes stratégies pour changer cela).

Voici un exemple de l'apparence des décorateurs:

public interface ISortingStrategy
{
    void Sort(IList<int> listToSort);
}

public class LoggingDecorator : ISortingStrategy
{
    private ISortingStrategy decorated;
    public LoggingDecorator(ISortingStrategy decorated)
    {
         this.decorated=decorated;
    }

    void Sort(IList<int> listToSort)
    { 
         Log("sorting using the strategy: " + decorated.ToString();
         decorated.Sort(listToSort);
    }
}

public class AuthorisingDecorator : ISortingStrategy
{
    private ISortingStrategy decorated;
    public AuthorisingDecorator(ISortingStrategy decorated)
    {
         this.decorated=decorated;
    }

    void Sort(IList<int> listToSort)
    { 
         if (CurrentUserIsAdministrator())
         {
             decorated.Sort(listToSort);
         }
         else
         {
             throw new UserNotAuthorizedException("Only administrators are allowed to sort");
         }
    }
}

Strategy_pattern

  1. Définit une famille d'algorithmes,
  2. Encapsule chaque algorithme, et
  3. Rend les algorithmes interchangeables dans cette famille.

Utilisez le modèle Stratégie lorsque vous devez modifier l'algorithme dynamiquement au moment de l'exécution.

Decorator

Le modèle Décorateur modifie dynamiquement la fonctionnalité d'un objet lors de l'exécution sans affecter la fonctionnalité existante des objets.

Quand utiliser:

  1. Ajoutez des fonctionnalités / responsabilités supplémentaires dynamiquement
  2. Supprimer les fonctionnalités / responsabilités dynamiquement
  3. Évitez trop de sous-classer pour ajouter des responsabilités supplémentaires.

Désavantages:

  1. Surutilisation du principe Ouvert Fermé (Ouvert pour extension et Fermé pour modification). Utilisez cette fonctionnalité avec parcimonie lorsque le code est le moins susceptible d'être modifié.
  2. Trop de petites classes et ajouteront des frais généraux de maintenance.

Différence clé:

La stratégie vous permet de changer le courage d'un objet. Decorator vous permet de changer la peau.

Quelques messages plus utiles:

Quand utiliser le motif décorateur?

Exemple du monde réel du modèle de stratégie

strategy par sourcemaking





strategy-pattern