Pregunta

Estoy en una clase en la que acabamos de aprender acerca de estos patrones de diseño. Sin embargo no pude ver ninguna diferencia entre ellos. Suenan igual que el mismo, la creación de clases concretas sobre el abstracto. Podría ayudar a alguien matarme esta duda? Gracias (:

¿Fue útil?

Solución

Tanto el visitante, la estrategia y el patrón de plantilla abarcan la aplicación de un algoritmo. La mayor diferencia está en la forma en que son evocados y la forma en que se utilizan en la práctica. Si bien puede parecer como si tuvieran el mismo caso de uso, mirada a la construcción de los objetos para ver la diferencia.

El patrón de estrategia se utiliza a menudo cuando no tenemos la capacidad de pasar alrededor de funciones como un objeto de primera clase. Se espera una lista de argumentos muy específica y sólo esa lista de argumentos en su patrón de llamadas. Por ejemplo:

struct MyStrat{
    void operator()(const Foo &_input){
        _input.up( 2 );
    }
};

std::for_each( myFooList.begin(), myFooList.end(), MyStrat() );

que se aplica entonces a una lista de objetos de tipo "Foo". Realmente no tenemos otra manera de aplicarlo a cualquier otro objeto.

El patrón de visitante en el otro lado se utiliza cuando queremos aplicar un algoritmo a un montón de objetos que pueden no compartir la misma firma ni tienen las mismas funciones miembro. Decimos patrón de visitante porque se utiliza a menudo cuando se atraviesa un árbol u otra colección de objetos "no relacionadas" (sin relación en un sentido herencia.)

struct MyVisitor{
    void visit(const Foo &_input){
         _input.up( 2 );
    }
    void visit(const Bar &_input){
         _input.raiseUp( 2 );
    }
    void visit(const Baz &_input){
         _input.setUp( 2 );
    }
 };

Aquí, la idea es que nos gustaría "arriba" todos estos objetos. Todos ellos no comparten la misma firma función miembro pero todos son conceptualmente relacionados. Por lo tanto, podemos "visitar" cada una de estas clases, sino esperar que el algoritmo para realizar el mismo tipo de tarea.

Mediante el uso de un patrón de visitantes que evite la necesidad de envolver cada clase en un patrón de proxy. Por lo tanto, para las clases N nos gustaría aplicar este algoritmo para que no necesitamos para hacer N clases de proxy. Tan sólo hay que añadir métodos a una clase N visitante.

El método de la plantilla es muy diferente de ya sea el visitante y el patrón de estrategia. Con la plantilla de lo que estamos tratando de hacer es hacer cumplir el mismo tipo de algoritmo, pero en diferentes subclases dentro de una jerarquía. Por ejemplo:

class Duck{
public:
    int count() =0;
    void makeNoise(int times) =0;
    void quack(){ makeNoise( count() ); }//the template pattern is here
};

class Mallard : public Duck{
public:
    int count(){ return 4; }
    void makeNoise( cout << "quack" << endl; }
};

class Daffy{
public:
    int count(){ return 1; }
    void makeNoise( cout << "Why I ought to..." << endl; }
};

Así, el resultado del algoritmo varía dentro de la jerarquía.

Otros consejos

Elementos comunes:

  1. Estrategia, el método de la plantilla y del visitante . Los tres modelos se clasifican como patrones de comportamiento

Diferencias:

  1. método plantilla utiliza Herencia y Estrategia utiliza composición
  2. El método de la plantilla implementado por la clase base no debe ser anulado. De esta manera, la estructura del algoritmo es controlado por la super clase, y los detalles se implementan en las clases sub
  3. Estrategia encapsula el algoritmo detrás de una interfaz, lo que nos proporciona la capacidad de cambiar el algoritmo en tiempo de ejecución
  4. Visitante patrón se utiliza para realizar una operación en un grupo de tipo similar de objetos. Con la ayuda del patrón de visitante, podemos mover la lógica de funcionamiento de los objetos a otra clase
  5. Si hay un cambio en la implementación de la Operación, tenemos que cambiar simplemente Visitante clase en lugar de tocar todos los demás objetos.

Para consultar Plantilla método , Estrategia y Visitante y artículos Sourcemaking para una mejor comprensión.

Puestos relacionados con:

Cuándo debo utilizar el patrón de diseño del visitante?

Ejemplo real del patrón de estrategia

patrón de diseño de la plantilla en el JDK, no pudo encontrar un método que define conjunto de métodos que se ejecutan en orden

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