Pergunta

Estou em uma aula onde acabamos de aprender sobre esses padrões de design.No entanto, não consegui ver nenhuma diferença entre eles.Eles soam iguais, criando classes concretas sobre as abstratas.Alguém poderia me ajudar a matar essa dúvida?obrigado (:

Foi útil?

Solução

Tanto o visitante quanto a estratégia e o padrão de modelo abrangem a aplicação de um algoritmo.A maior diferença está na forma como são evocados e como são utilizados na prática.Embora possa parecer que eles têm o mesmo caso de uso, observe a construção dos objetos para ver a diferença.

O padrão de estratégia é frequentemente usado quando não temos a capacidade de transmitir funções como um objeto de primeira classe.Ele espera uma lista de argumentos muito específica e apenas essa lista de argumentos em seu padrão de chamada.Por exemplo:

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

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

que é então aplicado a uma lista de objetos do tipo "Foo". Realmente não temos outra maneira de aplicá -lo a qualquer outro objeto.

O padrão de visitante, por outro lado, é usado quando queremos aplicar um algoritmo a um grupo de objetos que podem não compartilhar a mesma assinatura nem ter as mesmas funções de membro.Dizemos padrão de visitante porque é frequentemente usado ao percorrer uma árvore ou outra coleção de objetos "não relacionados" (não relacionados no sentido de herança).

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 );
    }
 };

Aqui, a ideia é que gostaríamos de “aumentar” todos esses objetos.Todos eles não compartilham a mesma assinatura de função de membro, mas estão conceitualmente relacionados.Portanto, podemos “visitar” cada uma dessas classes, mas esperar que o algoritmo execute o mesmo tipo de tarefa.

Ao usar um padrão de visitante evitamos a necessidade de agrupar cada classe em um padrão de proxy.Portanto, para N classes gostaríamos de aplicar este algoritmo, pois não precisamos fazer N classes proxy.Precisamos apenas adicionar N métodos a uma classe visitante.

O método do modelo é bastante diferente do padrão de visitante e de estratégia.Com o modelo, o que você está tentando fazer é impor o mesmo tipo de algoritmo, mas em subclasses diferentes dentro de uma hierarquia.Por exemplo:

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; }
};

Portanto, o resultado do algoritmo varia dentro da hierarquia.

Outras dicas

Comuns:

  1. Estratégia, método de modelo e visitante : Todos os três padrões são categorizados como padrões comportamentais.

Diferenças:

  1. Método do modelo usa herança e Estratégia usa composição
  2. o Método do modelo implementado pela classe base não deve ser substituído. Dessa forma, a estrutura do algoritmo é controlada pela super classe e os detalhes são implementados nas sub -classes
  3. Estratégia Encapsula o algoritmo por trás de uma interface, que nos fornece capacidade de alterar o algoritmo no tempo de execução
  4. Visitante O padrão é usado para executar uma operação em um grupo de objetos semelhantes. Com a ajuda do padrão do visitante, podemos mover a lógica operacional dos objetos para outra classe
  5. Se houver uma mudança na implementação da operação, precisamos apenas mudar Visitante classe em vez de tocar em todos os outros objetos.

Dê uma olhada em Método do modelo , Estratégia e Visitante e SOURCEMA artigos para melhor compreensão.

Postagens relacionadas:

Quando devo usar o padrão de design do visitante?

Exemplo do mundo real do padrão de estratégia

Padrão de design de modelo no JDK, não conseguiu encontrar um conjunto de métodos a serem executados para ser executado em ordem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top