209 votes

Quelle est la différence entre la méthode du modèle et les modèles de stratégie?

Peut quelqu'un m’expliquer quelle est la différence entre le modèle de méthode de modèle et le modèle de stratégie est ?

Autant que je peux dire qu’ils sont 99 % la même - la seule différence étant que le modèle de méthode de modèle a une classe abstraite comme classe de base, alors que la classe stratégie utilise une interface qui est implémentée par chaque béton classe de stratégie.

Toutefois, pour ce qui est le client est qu’ils sont consommés dans exactement de la même façon - est-ce correct ?

183voto

tvanfosson Points 268301

Le pattern template est utilisé lors d'une opération particulière a quelques invariants du comportement(s) qui peuvent être définis en fonction d'autres variables primitives comportements. La classe abstraite qui définit le comportement invariant(s), tandis que la mise en œuvre de classes définies les méthodes dépendant. Dans une stratégie, le comportement des implémentations sont indépendants -- la mise en œuvre de chaque classe définit le comportement et il n'y a pas de code partagé entre eux. Les deux sont des modèles de comportement et, comme tels, sont consommés de la même manière par les clients. Généralement, les stratégies d'avoir une seule méthode publique -- execute() méthode, alors que les modèles peuvent définir un ensemble de méthodes publiques ainsi que d'un ensemble de soutien privé primitives qui les sous-classes doivent implémenter.

Les deux modèles peuvent facilement être utilisés ensemble. Vous pourriez avoir un modèle de stratégie où plusieurs implémentations d'appartenir à une famille de stratégies mises en œuvre à l'aide d'un modèle de modèle.

161voto

thehouse Points 1134

La principale différence entre les deux, c'est quand le béton est l'algorithme choisi.

Avec la méthode de Modèle de modèle de ce qui se passe au moment de la compilation par les sous-classement le modèle. Chaque sous-classe fournit un autre algorithme concret par la mise en œuvre du modèle, des méthodes abstraites. Quand un client appelle des méthodes du modèle de l'interface externe, le modèle appelle ses méthodes abstraites (son interface interne) pour appeler l'algorithme.

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

En revanche, le modèle de Stratégie permet à un algorithme pour être choisi lors de l' exécution par le confinement. Le béton algorithmes sont mis en œuvre par des classes ou des fonctions qui sont passés à la stratégie en tant que paramètre de son constructeur ou une méthode de définition. L'algorithme choisi pour ce paramètre peut varier dynamiquement en fonction de l'état du programme ou des données.

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

En résumé:

  • Méthode de modèle de modèle: au moment de la compilation de l'algorithme de sélection par le sous-classement
  • Modèle de stratégie: au moment de l'exécution de l'algorithme de sélection par confinement

31voto

Ludwig Wensauer Points 1052

Je pense que la Classe-les Diagrammes de les deux modèle sont montrant les différences.

Stratégie
Encapsule un algorithme à l'intérieur d'une classe
Lien vers l'image enter image description here

Méthode De Modèle
Reporter les mesures exactes d'un algorithme à une sous-classe
Lien vers l'Image enter image description here

27voto

badbadboy Points 1754

Tu veux sans doute dire méthode de modèle de modèle. Vous avez raison, ils servent très similaire besoins. Je dirais qu'il est préférable d'utiliser un modèle de la méthode dans le cas où vous avez un "modèle" de l'algorithme ayant défini les étapes où les sous-classes de remplacer ces étapes pour modifier quelques détails. En cas de stratégie, vous devez créer une interface, et au lieu de l'héritage que vous êtes à l'aide de la délégation. Je dirais que c'est un peu plus puissant motif, et peut-être mieux, conformément à DIP - inversion de dépendance principes. Il est plus puissant parce que vous de définir clairement une nouvelle abstraction de la stratégie - un moyen de faire quelque chose, qui ne s'applique pas au modèle de la méthode. Donc, si cette abstraction du sens - de l'utiliser. Cependant, en utilisant la méthode de modèle peut vous donner des modèles plus simple dans les cas simples, ce qui est également important. Considérez les mots fit mieux: avez-vous un modèle d'algorithme? Ou est la chose que vous avez ici une abstraction de la stratégie - nouvelle manière de faire quelque chose

Exemple d'un modèle de méthode:

Application.main()
{
Init();
Run();
Done();
}

Ici, vous héritez de l'application et de remplacer exactement ce qui sera fait sur init, d'exécuter et de faire.

Exemple de stratégie:

array.sort (IComparer<T> comparer)

Ici, lors de l'écriture d'un comparateur, vous n'héritez pas à partir d'un tableau. Tableau des délégués de l'algorithme de comparaison d'un comparateur.

23voto

flicken Points 5887

Héritage et agrégation (est-un contre a-a). C’est deux façons de réaliser le même objectif.

Cette question montre quelques-unes des compromis entre les choix : http://stackoverflow.com/questions/269496/inheritance-vs-aggregation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X