155 votos

¿Cuál es la diferencia entre el método de la plantilla y los patrones de estrategia?

¿Puede alguien por favor me explique cuál es la diferencia entre el plantilla método patrón y el patrón de estrategia es?

En cuanto a la verdad son 99% la misma - la única diferencia es que el patrón del método plantilla tiene una clase abstracta como la clase base mientras que la clase de estrategia utiliza una interfaz implementada por cada concreto clase de estrategia.

¿Sin embargo, en cuanto se refiere al cliente son consumidos en exactamente la misma manera - es correcto?

128voto

tvanfosson Puntos 268301

La plantilla de patrón se utiliza cuando una operación en particular tiene algunos invariante de la conducta(s) que puede ser definida en términos de otras variables primitivas comportamientos. La clase abstracta define el invariante de la conducta(s), mientras que la implementación de las clases se definen los métodos dependientes. En una estrategia, el comportamiento de las implementaciones son independientes, cada clase de implementación define el comportamiento y no hay ningún código compartido entre ellos. Ambos son patrones de comportamiento y, como tal, se consumen de la misma manera por los clientes. Normalmente, las estrategias tienen un único método público -- la execute() método, mientras que las plantillas puede definir un conjunto de métodos públicos, así como un conjunto de apoyo privado primitivas que las subclases deben implementar.

Los dos modelos pueden ser fácilmente utilizados juntos. Usted podría tener un patrón de estrategia donde varias implementaciones de pertenecer a una familia de estrategias implementadas utilizando una plantilla de patrón.

126voto

thehouse Puntos 1134

La principal diferencia entre los dos es cuando el hormigón algoritmo elegido.

Con el método de Plantilla patrón que esto ocurre en tiempo de compilación por crear subclases de la plantilla. Cada subclase ofrece un concretos diferentes algoritmo mediante la implementación de la plantilla métodos abstractos. Cuando un cliente invoca los métodos de la plantilla de la interfaz externa de la plantilla de llamadas a sus métodos abstractos (su interfaz interna) como necesaria para invocar el algoritmo.

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

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

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

En contraste, el patrón de Estrategia permite un algoritmo para ser elegido en tiempo de ejecución por la contención. El hormigón se implementan los algoritmos de distintas clases o funciones que se pasan a la estrategia como un parámetro en su constructor o un método setter. El algoritmo que se elige para este parámetro puede variar de forma dinámica basándose en el estado del programa o insumos.

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

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

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

En resumen:

  • Método de plantilla de patrón: en tiempo de compilación algoritmo de selección por la creación de subclases
  • El modelo de estrategia: tiempo de ejecución del algoritmo de selección de contención

24voto

Ludwig Wensauer Puntos 1052

Creo que la Clase-los Diagramas de ambos patrón están mostrando las diferencias.

Estrategia
Encapsula un algoritmo dentro de una clase
Enlace a la imagen enter image description here

Método De Plantilla
Aplazar las medidas exactas de un algoritmo para una subclase
Enlace a la Imagen enter image description here

22voto

badbadboy Puntos 1754

Usted probablemente significa método de plantilla de patrón. Tienes razón, sirven muy similares necesidades. Yo diría que es mejor usar el método de plantilla en los casos cuando se tiene una "plantilla" algoritmo de haber definido los pasos donde subclases reemplazar estos pasos para cambiar algunos detalles. En el caso de la estrategia, es necesario crear una interfaz, y en lugar de la herencia que se le están haciendo uso de la delegación. Yo diría que es un poco más potente patrón y tal vez mejor, de acuerdo a DIP - dependencia de la inversión de los principios. Es más potente porque claramente definir una nueva abstracción de la estrategia es una manera de hacer algo, que no se aplica a la plantilla de método. Por lo tanto, si esta abstracción tiene sentido utilizarlo. Sin embargo, utilizando el método de plantilla puede dar más simple de los diseños en los casos más sencillos, que también es importante. Considere la posibilidad de que las palabras que se ajuste mejor: ¿tiene usted un algoritmo de plantilla? O es lo más importante que usted tenga una abstracción de la estrategia nueva manera de hacer algo

Ejemplo de un método de plantilla:

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

Aquí se hereda de aplicación y sustituir lo que exactamente se llevará a cabo en init, ejecutar y listo.

Ejemplo de una estrategia:

array.sort (IComparer<T> comparer)

Aquí, al escribir un comparador, no se heredan de una matriz. Matriz de delegados el algoritmo de comparación a un comparador.

18voto

flicken Puntos 5887

Herencia versus agregación (es un versus ha-a). Es dos maneras de lograr el mismo objetivo.

Esta pregunta muestra algunas de las compensaciones entre las opciones: http://stackoverflow.com/questions/269496/inheritance-vs-aggregation

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X