Modèle De Stratégie V / S Modèle De Décorateur

je viens de rencontrer deux modèles.

  1. Schéma De Stratégie

  2. Décorateur

Schéma De Stratégie: -

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

Motif Décorateur: -

décorateur modèle ajoute certaines fonctionnalités du composant.

en fait, j'ai trouvé que stratégie Modèle et décorateur modèle peut également être utilisé de façon interchangeable.

Voici le lien :- quand et comment appliquer le modèle de stratégie au lieu du modèle de décorateur?

Quelle est la différence entre le modèle de stratégie et décorateur Motif?

quand doit-on utiliser le modèle de stratégie et le modèle de décorateur?

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

39
demandé sur Ravindra babu 2014-10-17 14:19:06

5 réponses

le pattern de stratégie vous permet de changer la mise en œuvre de quelque chose utilisé à l'exécution.

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

la différence principale est dans le changement vs augmentation

dans l'une des questions que vous avez liées à elle indique également qu'avec le modèle de stratégie le consommateur est conscient que les différentes options existent pas, alors qu'avec le décorateur motif que le consommateur ne serait pas conscient de la fonctionnalité supplémentaire.

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

nous sommes en train de changer le type de tri à l'exécution (pour être plus efficace sur la base de quelques informations supplémentaires.) c'est le modèle de stratégie.

imaginez 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 pour restreindre le tri aux utilisateurs admin. Nous pouvons ajouter ces deux morceaux de fonctionnalité en créant un décorateur qui améliore tout ISortingStrategy . Nous pourrions créer un décorateur qui bûches qu'il a été utilisé pour trier quelque chose et le type de la stratégie de tri décoré. Et nous pourrions ajouter un autre décorateur qui vérifie si l'utilisateur est un administrateur, avant qu'il appelle le stratégie de tri décorée.

nous ajoutons ici de nouvelles fonctionnalités à n'importe quelle stratégie de tri en utilisant le décorateur, mais nous ne 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");
         }
    }
}
76
répondu Sam Holder 2018-08-20 16:03:28

Strategy_pattern

  1. définit une famille d'algorithmes,
  2. encapsule chaque algorithme, et
  3. rend les algorithmes interchangeables au sein de cette famille.

utilisez le pattern de stratégie quand vous devez changer l'algorithme dynamiquement au moment de l'exécution.

Décorateur

Décorateur modèle de dynamique des changements de la fonctionnalité d'un objet au moment de l'exécution, sans impact sur les fonctionnalités existantes des objets.

quand utiliser:

  1. ajouter des fonctionnalités/responsabilités supplémentaires de manière dynamique
  2. supprimer les fonctionnalités/responsabilités de manière dynamique
  3. éviter une trop grande sous-classification pour ajouter des responsabilités supplémentaires.

Inconvénients:

  1. utilisation excessive 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 ajoutera les frais généraux d'entretien.

principale différence:

la stratégie vous permet de changer les boyaux d'un objet. Décorateur vous permet de changer la peau.

Quelques messages plus utiles:

quand utiliser le motif décorateur?

Monde Réel Exemple de la Stratégie de la tendance

stratégie par sourcemaking

8
répondu Ravindra babu 2017-09-20 06:17:13

La stratégie est un motif qui est utilisé pour "encapsuler ce qui change". Il vous permet de définir des algorithmes qui peuvent être interchangés à l'exécution. Par exemple (exemple tiré de Head First Design Patterns):

dis que tu as un simulateur de canard. Vous voulez faire voler vos objets de canard. Tu pourrais utiliser l'héritage pour ça, mais ça devient vite compliqué. Certains canards ne peuvent pas voler (par exemple, les canards en caoutchouc). La façon de le faire est d'encapsuler ce qui change i.e. le comportement de vol dans son propre classe qui implémente Iflybehavior par exemple. Vous pouvez alors utiliser la composition au lieu de l'héritage et injecter le Iflybehavior dans vos objets de canard. Vous pouvez également avoir une méthode qui règle ce comportement de vol de sorte que le comportement de vol peut être modifié à l'exécution. Il s'agit essentiellement du schéma stratégique.

le motif Décorateur est utilisé pour ajouter une fonctionnalité à un objet à l'exécution. Il vous permet d'envelopper des objets dans des objets. Les décorateurs doivent avoir le même supertype comme les objets qu'ils décorent. Cela vous permet d'appeler une méthode sur le "outmost wrapper" et vous pouvez ensuite chaîne appeler cette même méthode à travers les couches de décorateurs. Il s'agit d'une approche plus souple de sous-classement.

à ceux Que vous choisissez dépend du problème que vous souhaitez résoudre. Voulez-vous avoir une famille d'algorithmes interchangeables à l'exécution ou voulez-vous dynamiquement ajouter plus de fonctionnalités à un objet à l'exécution?

Le livre "la Tête la première, les modèles de conception", explique cela très bien (probablement beaucoup mieux que moi) de l'OMI, de sorte qu'il est intéressant à lire si vous en avez l'occasion.

bonne chance.

5
répondu Magrangs 2014-10-17 10:34:20

cela se résume à ceci: utilisez la stratégie pour choisir un morceau de fonctionnalité de base. Utilisez Decorator pour ajouter des fonctionnalités supplémentaires. Stratégie est le gâteau que nous faisons et décorateur est toutes les jolies décorations que nous ajoutons à elle.

1
répondu kirk.burleson 2015-07-08 18:26:24

Decorator est d'ajouter des fonctionnalités supplémentaires à une instance d'une classe, de sorte qu'il est mis en œuvre dans l'exécution de manière dynamique.C'est un modèle d'extensions de comportement. En raison des conditions pratiques dans lesquelles Subclassing est de retour de briser. Stratégie est un modèle que différents objets de stratégie partagent la même fonction abstraite, l'objet de contexte concret peut être configuré à l'exécution avec l'objet de stratégie concrète d'un ensemble de famille. En tant que MVC, contrôleur est un cas de rôle de stratégie, la vue restrain la structure de données de sortie, tandis que-comme les contrôleurs seront différents à l'exécution, qui changent dynamiquement les données de sortie de la vue.

0
répondu YoungJeXu 2018-01-24 03:58:56