Patron de décor V / S Pattern Pattern

Je suis juste tombé sur deux modèles.

  1. Modèle de stratégie

  2. Décorateur

Modèle de stratégie: –

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

Motif Décorateur: –

Le motif de décorateur ajoute des fonctionnalités aux composants.

En fait, j’ai trouvé que le Pattern Pattern et le Pattern Decorator peuvent aussi être utilisés de manière interchangeable.

Voici le lien: – Quand et comment le modèle de stratégie peut-il être appliqué à la place du motif de décorateur?

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

lorsque le modèle de stratégie doit être utilisé et quand le motif de décorateur doit être utilisé?

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

    Le modèle de stratégie vous permet de modifier l’implémentation d’un élément utilisé lors de l’exécution.

    Le modèle de décorateur vous permet d’augmenter (ou d’append) des fonctionnalités existantes avec des fonctionnalités supplémentaires au moment de l’exécution.

    La principale différence réside dans le changement vs l’ augmentation

    Dans l’une des questions que vous avez abordées, vous indiquez également que, 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 au courant des fonctionnalités supplémentaires.

    Par exemple, imaginez que vous écrivez quelque chose pour sortinger une collection d’éléments. Donc, vous écrivez une interface ISortingStrategy vous pouvez ensuite implémenter plusieurs stratégies de sorting 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 sortinger 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 sorting, nous utiliserons BubbleSortStrategy sinon nous utiliserons QuickSortStrategy .

    Nous modifions le type de sorting à l’exécution (pour être plus efficace en fonction d’informations supplémentaires), il s’agit du modèle de stratégie.

    Imaginez maintenant que quelqu’un nous demande de fournir un journal sur la fréquence à laquelle chaque algorithme de sorting est utilisé pour effectuer un sorting réel et pour limiter le sorting aux utilisateurs admin. Nous pouvons append ces deux fonctionnalités en créant un décorateur qui améliore toute ISortingStrategy . Nous pourrions créer un décorateur qui enregistre qu’il était utilisé pour sortinger quelque chose et le type de stratégie de sorting décoré. Et nous pourrions append un autre décorateur qui vérifiait si l’utilisateur actuel était un administrateur avant d’appeler la stratégie de sorting décorée.

    Ici, nous ajoutons de nouvelles fonctionnalités à toute stratégie de sorting en utilisant le décorateur, mais nous ne remplaçons pas la fonctionnalité de sorting de base (nous avons utilisé les différentes stratégies pour changer cela)

    Voici un exemple de la façon dont les décorateurs pourraient ressembler:

     public interface ISortingStrategy { void Sort(IList listToSort); } public class LoggingDecorator : ISortingStrategy { private ISortingStrategy decorated; public LoggingDecorator(ISortingStrategy decorated) { this.decorated=decorated; } void Sort(IList listToSort) { Log("sorting using the strategy: " + decorated.ToSsortingng(); decorated.Sort(listToSort); } } public class AuthorisingDecorator : ISortingStrategy { private ISortingStrategy decorated; public AuthorisingDecorator(ISortingStrategy decorated) { this.decorated=decorated; } void Sort(IList 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 au sein de cette famille.

    Utilisez le modèle de stratégie lorsque vous devez modifier l’algorithme de manière dynamic au moment de l’exécution.

    Décorateur

    Le motif de décorateur modifie dynamicment la fonctionnalité d’un object au moment de l’exécution sans affecter la fonctionnalité existante des objects.

    Quand utiliser:

    1. Ajouter des fonctionnalités / responsabilités supplémentaires de manière dynamic
    2. Supprimer les fonctionnalités / responsabilités de manière dynamic
    3. Évitez de sous-classer trop pour append des responsabilités supplémentaires.

    Désavantages:

    1. Principe de surutilisation de Open Closed (Open for extension et Closed for modification). Utilisez cette fonctionnalité avec modération lorsque le code est le moins susceptible d’être modifié.
    2. Trop de petites classes et appendont des frais de maintenance.

    Différence clé:

    La stratégie vous permet de changer les entrailles d’un object. Le décorateur vous permet de changer la peau.

    Quelques messages plus utiles:

    Quand utiliser le motif de décorateur?

    Real World Exemple de modèle de stratégie

    stratégie de fabrication

    La stratégie est le modèle utilisé pour “encapsuler ce qui change”. Il vous permet de définir des algorithmes interchangeables à l’exécution. Par exemple (exemple tiré de Head First Design Patterns):

    Disons que vous avez un simulateur de canard. Vous voulez faire voler vos objects de canard. Vous pouvez utiliser l’inheritance pour cela, mais cela devient rapidement compliqué. Certains canards ne peuvent pas voler (par exemple des canards en caoutchouc). La manière de procéder consiste à encapsuler ce qui change, par exemple le comportement de la mouche dans sa propre classe qui implémente IFlybehaviour par exemple. Vous pouvez ensuite utiliser la composition plutôt que l’inheritance et injecter le comportement IFlybe dans vos objects canards. Vous pourriez également avoir une méthode qui définit ce comportement de vol afin que le comportement de volée puisse être modifié à l’exécution. C’est essentiellement le modèle de stratégie.

    Le modèle de décorateur est utilisé pour append des fonctionnalités à un object lors de l’exécution. Il vous permet d’emballer des objects dans des objects. Les décorateurs doivent avoir le même supertype que les objects qu’ils décorent. Cela vous permet d’appeler une méthode sur le “wrapper le plus à l’extérieur” et vous pouvez ensuite appeler cette même méthode à travers les couches de décorateurs. C’est fondamentalement une approche plus flexible que le sous-classement.

    Le choix de votre choix dépend du problème que vous souhaitez résoudre. Voulez-vous avoir une famille d’algorthims interchangeables à l’exécution ou souhaitez-vous append dynamicment plus de fonctionnalités à un object au moment de l’exécution?

    Le livre “Head first design patterns” explique très bien (probablement beaucoup mieux que moi) IMO, donc ça vaut le coup de lire si vous en avez la chance.

    Bonne chance.

    Cela se résume à ceci: Utilisez la stratégie pour choisir un élément de fonctionnalité de base. Utilisez Decorator pour append des fonctionnalités supplémentaires. La stratégie est le gâteau que nous créons et Decorator est la belle décoration que nous y ajoutons.

    Decorator consiste à append des fonctionnalités supplémentaires à une instance d’une classe, de sorte qu’il soit implémenté de manière dynamic au moment de l’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 dont les différents objects Stratégie partagent la même fonction abstraite, l’object de contexte concret pouvant être configuré au moment de l’exécution avec l’object de stratégie concret d’un ensemble de familles. Comme MVC, controller est un cas de rôle de stratégie, la vue restreint la structure de données de sortie, tandis que les contrôleurs seront différents à l’exécution, ce qui modifie dynamicment les données de sortie de la vue.