Pregunta

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

Por lo que yo puedo decir que son el 99% de la misma - siendo la única diferencia que el patrón método plantilla tiene una clase abstracta como la base clase mientras que la clase estrategia utiliza una interfaz que se implementa por cada clase de estrategia concreta.

Sin embargo, en cuanto a la cliente Se muestra preocupado por que se consumen exactamente de la misma manera - si esto es correcto

¿Fue útil?

Solución

La principal diferencia entre los dos es cuando se elige el algoritmo concreto.

Con la Template Method esto ocurre en tiempo de compilación- por subclases la plantilla. Cada subclase proporciona un algoritmo concreto mediante la aplicación de diferentes métodos abstractos de la plantilla. Cuando un cliente llama a los métodos de interfaz externa de la plantilla de la plantilla llama a sus métodos abstractos (su interfaz interna) según sea necesario 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, la patrón de estrategia permite un algoritmo para ser elegido a runtime por contención . Los algoritmos concretos son implementados por clases separadas o funciones que se pasan a la estrategia como un parámetro a su constructor o a un método setter. Qué algoritmo se elige para este parámetro puede variar dinámicamente en función del estado o las entradas del programa.

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

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

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

En resumen:

    método
  • Plantilla patrón: tiempo de compilación algoritmo de selección por subclases
  • patrón
  • Estrategia: algoritmo tiempo de ejecución selección por contención

Otros consejos

El patrón de plantilla se usa cuando una operación particular tiene algún comportamiento (s) invariante que se puede definir en términos de otros comportamientos primitivos diferentes. La clase abstracta define el comportamiento (s) invariante, mientras que las clases de aplicación definen los métodos dependientes.

En una estrategia, las implementaciones de comportamiento son independientes - cada clase de aplicación define el comportamiento y no existe un código compartido entre ellos. Ambos son patrones de comportamiento y, como tal, se consumen menos de la misma manera por los clientes. Típicamente, las estrategias tienen un único método público - el método execute(), mientras que las plantillas pueden definir un conjunto de métodos públicos, así como un conjunto de primitivas de apoyo subclases privadas que deben poner en práctica

.

Los dos patrones fácilmente podrían utilizarse juntos. Es posible que tenga un patrón de estrategia donde varias implementaciones pertenecen a una familia de las estrategias implementadas usando un patrón de plantilla.

Creo que la Clase-Diagramas de ambos patrones están mostrando las diferencias.

Estrategia
Encapsula un algoritmo dentro de una clase
Enlace a imagen introducir descripción de la imagen aquí

Plantilla Método
Aplazar las medidas exactas de un algoritmo para una subclase
Enlace a imagen introducir descripción de la imagen aquí

Es probable que decir Template Method. Tiene usted razón, sirven necesidades muy similares. Yo diría que es mejor usar método de la plantilla en los casos cuando se tiene un algoritmo de "plantilla" que tiene pasos definidos en subclases anulan estos pasos para cambiar algunos detalles. En el caso de la estrategia, es necesario crear una interfaz, y en vez de la herencia que está utilizando delegación. Yo diría que es un poco más potente patrón y tal vez mejor, de acuerdo a Dip - dependencia principios de inversión. Es más potente debido a que defina claramente una nueva abstracción de la estrategia - una forma de hacer algo, que no se aplica al método de la plantilla. Por lo tanto, si esta abstracción tiene sentido - usarlo. Sin embargo, utilizando el método de plantilla puede darle diseños más simples en casos sencillos, que también es importante. Considere que las palabras se ajuste mejor: ¿Tiene un algoritmo de plantilla? O es la clave aquí que tiene una abstracción de la estrategia - nueva manera de hacer algo

Ejemplo de un método de plantilla:

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

A continuación se hereda de la aplicación y el sustituto de qué es exactamente lo que se hará al iniciar, ejecutar y hecho.

Ejemplo de una estrategia:

array.sort (IComparer<T> comparer)

A continuación, cuando se escribe un comparador, no se hereda de una matriz. delegados de la matriz del algoritmo de comparación a un comparador.

 Diferencia entre Estrategia y Estrategia Template Method vs método plantilla


Similitudes

Los patrones de estrategia y método de la plantilla tienen muchas similitudes entre ellos. Ambos patrones procedimiento de estrategia y plantilla se puede utilizar para satisfacer el principio abierto-cerrado y haciendo que el módulo de software fácil de extender, sin cambiar su código. Ambos patrones representan separación de la funcionalidad genérica de la aplicación detallada de esa funcionalidad. Sin embargo, difieren un poco en términos de granularidad que ofrecen.


Diferencias

Estas son algunas de las diferencias que he observado, mientras que el estudio de estos dos patrones:

  1. En la estrategia, el acoplamiento entre el cliente y la estrategia es más suelta mientras que en el Método de plantilla, los dos módulos son más fuertemente acoplado.
  2. En la estrategia, sobre todo una interfaz se utiliza embargo clase abstracta puede También puede utilizar dependiendo de la situación, y la clase concreta no es utilizado mientras que en su mayoría método de plantilla de clase abstracta o concreta clase se utiliza, no se utiliza la interfaz.
  3. En el patrón de estrategia, el comportamiento en general, toda la clase se representado en términos de una interfaz, por otra parte, se utiliza el método Plantilla para reducir la duplicación de código y el código repetitivo se define en marco de base o clase abstracta. En el Método de plantilla, puede haber incluso una clase concreta con la implementación por defecto.
  4. En palabras sencillas, puede cambiar toda la estrategia (algoritmo) de patrón de estrategia, sin embargo, en el método de la plantilla, sólo algunas cosas cambio (partes de algoritmo) y el resto de las cosas no han cambiado. En el Método de plantilla, las medidas invariantes se implementan en una clase base abstracta, mientras que el pasos variantes se dan ya sea una implementación por defecto, o ninguna aplicación en absoluto. En el método de la plantilla, el diseñador de componentes ordena los pasos que se requieren de un algoritmo, y el orden de la pasos, pero permite que el cliente componente para extender o reemplazar algunos número de estos pasos.

La imagen se toma desde el href="http://www.bitesizedcsharp.com/" rel="noreferrer"> el blog .

Los dos son muy similares, y ambos son consumidos por el código de cliente de manera similar. A diferencia de lo que la respuesta más popular dice más arriba, ambos permiten selección del algoritmo en tiempo de ejecución .

La diferencia entre los dos es que mientras que el patrón de estrategia permite que diferentes implementaciones para utilizar completamente diferentes formas de la consecución del resultado deseado, la Template Method especifica un general algoritmo (el método de "plantilla"), que se puede utilizar para lograr el resultado - la única opción de izquierda a las implementaciones específicas (sub-clases) son ciertos detalles de dicho método plantilla. Esto se hace por tener la llamada (s) el método de plantilla de maquillaje a uno o más Extracto métodos que son anulados (es decir implementado) por las sub-clases, a diferencia del método de la plantilla, que en sí no es abstracto y no anulado por las sub-clases.

El código de cliente realiza una llamada al método de plantilla mediante una referencia / puntero del tipo de clase que señala abstracto a una instancia de una de las subclases concretas que se puede determinar en tiempo de ejecución al igual que al utilizar el patrón de estrategia.

Método Plantilla:

  1. Se basa en herencia
  2. define esqueleto de algoritmo que no puede ser cambiado por subclases. Sólo ciertas operaciones se pueden anular en subclases
  3. Padres clase completamente controla el algoritmo y difiere sólo ciertos pasos para clases concretas
  4. La vinculación se realiza en tiempo de compilación

Template_method estructura:

introducir descripción de la imagen aquí

Estrategia:

  1. Se basa en delegación / composición
  2. Cambia las tripas del objeto mediante la modificación de la conducta método
  3. Se utiliza para interruptor entre la familia de algoritmos
  4. Se cambia el comportamiento del objeto en tiempo de ejecución completamente sustitución de un algoritmo con otro algoritmo en tiempo de ejecución
  5. La unión se realiza en tiempo de ejecución

estrategia estructura :

introducir descripción de la imagen aquí

Tener un vistazo a método de la plantilla y Estrategia para una mejor comprensión.

Puestos relacionados con:

Plantilla de patrón de diseño en el JDK, no pudo encontrar un método que define conjunto de métodos que se ejecutará con el fin

Ejemplo Mundial

real del patrón de estrategia

No, no son necesariamente consumidos de la misma manera. El patrón "método de la plantilla" es una forma de proporcionar "orientación" a futuros ejecutores. Que les están diciendo, "Todos los objetos persona debe tener un número de seguro social" (que es un ejemplo trivial, pero tiene la idea a través correctamente).

El patrón de estrategia permite múltiples posibles implementaciones que ser cambiado en y fuera. No es (generalmente) implementa a través de la herencia, pero no por dejar que la persona que llama pasa en la aplicación deseada. Un ejemplo podría estar permitiendo una ShippingCalculator a estar dotado de una de varias maneras diferentes de calcular los impuestos (una implementación NoSalesTax, y una aplicación PercentageBasedSalesTax tal vez).

Así que, a veces, la cliente en realidad decirle al objeto que la estrategia a utilizar. Como en

myShippingCalculator.CalculateTaxes(myCaliforniaSalesTaxImpl);

Sin embargo, el cliente nunca lo haría para un objeto que se basa en el método de plantilla. De hecho, el cliente ni siquiera podría conocer un objeto se basa en el método de plantilla. Esos métodos abstractos en el patrón Template Method incluso podrían estar protegidos, en cuyo caso el cliente ni siquiera saben que existen.

Yo te sugeriría leer esta artículo. Se explican las diferencias en un ejemplo de un caso real.

cita del artículo

  

" Como se puede ver también la implementación de clases dependerá de la plantilla   clase método. Esta dependencia hace que se cambie el método de plantilla si   uno quiere cambiar algunos de los pasos del algoritmo. En el otro   estrategia lado encapsula completamente el algoritmo. se da la   la implementación de clases para definir completamente un algoritmo. Por lo tanto, si   cualquier cambio llega uno tiene necesidad de cambiar el código previamente   clases escritas. Esta fue la razón principal elijo estrategia para   el diseño de las clases.

     

Una característica del método de plantilla es que el método plantilla controla la   algoritmo. Que puede ser una buena cosa en otra situación, pero en mi   problema que esto me estaba restringiendo el diseño de las clases. En el otro   estrategia lado no controla las etapas de un algoritmo que permite   que añada completamente diferentes métodos de conversión. De ahí que en mi caso   estrategia me ayuda para su implementación.

     

Uno de los inconvenientes de la estrategia es que hay demasiada redundancia de código y   menos de código compartido. Como es obvio en el ejemplo que se presenta de esta   Artículo tengo que repetir el mismo código en cuatro clases de nuevo y   de nuevo. Por lo tanto, es difícil de mantener porque si la implementación   de nuestro sistema como el paso 4, que es común a todos se cambia entonces   tendrá que actualizar esto en todas las 5 clases. Por otro lado, en   método de la plantilla, lo único que puede cambiar la superclase y los cambios son   reflejado en las subclases. Por lo tanto método de la plantilla da una muy   baja cantidad de redundancia y alta cantidad de código compartido entre las   clases.

     

Estrategia también permite cambiar el algoritmo en tiempo de ejecución. en la plantilla   Método uno tendrá que volver a inicializar el objeto. Esta característica de la   estrategia de proporcionar gran cantidad de flexibilidad. Desde el punto de diseño   Ver lo que hay que preferir la composición sobre la herencia. Por lo tanto, el uso de   patrón de estrategia también se convirtió en la primera opción para el desarrollo. "

El Modelo del modelo es similar al patrón de Estrategia. Estos dos patrones difieren en alcance y en la metodología.

La estrategia se utiliza para permitir que las personas que llaman para variar un algoritmo entero, al igual que la forma de calcular los diferentes tipos de impuestos, mientras que la plantilla método se utiliza para variar los pasos de un algoritmo. Debido a esto, la estrategia es de grano más grueso. La plantilla permite controles de grano más fino en el consecuente de las operaciones, y sin embargo permite que las implementaciones de estos detalles a varían.

La otra diferencia principal es que la estrategia utiliza delegación, mientras que la plantilla método utiliza la herencia. En Estrategia, el algoritmo se delega a la otra clase xxxStrategy que el sujeto tendrá una referencia a, pero con la plantilla que subclase la base y reemplazar los métodos para hacer cambios.

desde http://cyruscrypt.blogspot.com/2005 /07/template-vs-strategy-patterns.html

En la estrategia de subclases de patrones están ejecutando el programa y que controlan el algoritmo. Aquí código se duplica a través de las subclases. El conocimiento del algoritmo y la forma de ponerla en práctica se distribuye en muchas clases.

En patrón de plantilla, clase base tiene algoritmo. Maximiza la reutilización entre las subclases. Dado que el algoritmo se encuentra en un solo lugar, la clase base protege.

  

Estrategia de Diseño Patrón

  • Apoya composición.
  • Le proporciona la flexibilidad para cambiar el comportamiento de los objetos en tiempo de ejecución.
  • Menos de acoplamiento entre el código de cliente y el código de la solución / algoritmo.
  

Plantilla Método Patrón de diseño

  • favores de herencia sobre la composición
  • Definir el algoritmo en su clase base. Las piezas individuales de algoritmo pueden ser personalizadas en las clases de niño.

patrón de plantilla:

método de la plantilla se trata de dejar subclases redefinir ciertos pasos del algoritmo, sin cambiar la estructura y pasos del algoritmo principal, definido en la clase base. Modelo del modelo por lo general utiliza la herencia, por lo que una aplicación genérica de los algoritmos se puede proporcionar en la clase base, que la subclase podría optar por reemplazar si es necesario.

public abstract class RobotTemplate {
    /* This method can be overridden by a subclass if required */
    public void start() {
        System.out.println("Starting....");
    }

    /* This method can be overridden by a subclass if required */
    public void getParts() {
        System.out.println("Getting parts....");
    }

    /* This method can be overridden by a subclass if required */
    public void assemble() {
        System.out.println("Assembling....");
    }

    /* This method can be overridden by a subclass if required */
    public void test() {
        System.out.println("Testing....");
    }

    /* This method can be overridden by a subclass if required */
    public void stop() {
        System.out.println("Stopping....");
    }

    /*
     * Template algorithm method made up of multiple steps, whose structure and
     * order of steps will not be changed by subclasses.
     */
    public final void go() {
        start();
        getParts();
        assemble();
        test();
        stop();
    }
}


/* Concrete subclass overrides template step methods as required for its use */
public class CookieRobot extends RobotTemplate {
    private String name;

    public CookieRobot(String n) {
        name = n;
    }

    @Override
    public void getParts() {
        System.out.println("Getting a flour and sugar....");
    }

    @Override
    public void assemble() {
        System.out.println("Baking a cookie....");
    }

    @Override
    public void test() {
        System.out.println("Crunching a cookie....");
    }

    public String getName() {
        return name;
    }
}

Nota En el código anterior, los pasos de algoritmo Go () siempre será el mismo, pero las subclases podría definir una receta diferente para la realización de un paso particular.

patrón de estrategia:

patrón de estrategia se trata de dejar cliente selecciona los algoritmos concretos aplicación en tiempo de ejecución. Todos los algoritmos son aislados e independientes, pero implementan una interfaz común, y no hay noción de definir los pasos particulares dentro del algoritmo.

/**
 * This Strategy interface is implemented by all concrete objects representing an
 * algorithm(strategy), which lets us define a family of algorithms.
 */
public interface Logging {
    void write(String message);
}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class ConsoleLogging implements Logging {

    @Override
    public void write(String message) {
        System.out.println(message); 
    }

}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class FileLogging implements Logging {

    private final File toWrite;

    public FileLogging(final File toWrite) {
        this.toWrite = toWrite;
    }

    @Override
    public void write(String message) {
        try {
            final FileWriter fos = new FileWriter(toWrite);
            fos.write(message);
            fos.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }

}

Para el código fuente completo, echa un vistazo a mi github repositorio .

Estrategia se expone como un método de interfaz y la plantilla como la clase abstracta. Esto normalmente se utiliza mucho en los marcos. p.ej. MessageSource clase de marco de primavera es una interfaz estrategia para resolver los mensajes. El cliente utiliza en particular la aplicación (estrategia) de esta interfaz.

Y la implementación abstracta de la misma AbstractMessageSource interfaz, que tiene aplicación común de mensajes de resolución y expone resolveCode método abstracto () para que sub-clases pueden implementar en sus formas. AbstractMessageSource es un ejemplo de método de la plantilla.

http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbstractMessageSource.html

En el método de la plantilla de este patrón de diseño, uno o más pasos de algoritmo pueden ser anulados por las subclases para permitir diferentes comportamientos mientras que asegura que el algoritmo global aún es seguido (Wiki).

El método Plantilla nombre del patrón significa lo que es. Digamos que tenemos un método CalculateSomething () y queremos a la plantilla este método. Este método será declarado en la clase base de un método no virtual. Decir que el método es el siguiente.

CalculateSomething(){
    int i = 0;
    i = Step1(i);
    i++;
    if (i> 10) i = 5;
    i = Step2(i);
    return i;

} Paso 1 Paso 2 y implementación del método puede ser dada por las clases derivadas.

En Patrón Estrategia no hay ninguna aplicación proporcionada por la base (Esta es la razón por la cual la base es realmente una interfaz en el diagrama de clases)

El ejemplo clásico es la clasificación. Basado en el número de objetos tiene que ser resuelto la clase algoritmo apropiado (fusionar, burbuja, etc. rápida) se crea y todo el algoritmo está encapsulado en cada clase.

Ahora podemos aplicar la clasificación como un método de la plantilla? Ciertamente, se puede, pero usted no encontrará mucho / ninguna coincidencia para ser extraída y se coloca en la implementación base. Por lo tanto, en contra del propósito de Template Method.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top