Pergunta

Quando descobri o padrão Estratégia, fiquei impressionado com as possibilidades aparentemente infinitas que ele oferecia a mim e aos meus programas.Eu poderia encapsular melhor o comportamento dos meus modelos e até mesmo trocar esse comportamento rapidamente.Mas a estratégia também poderia ser usada para fornecer características e carga útil ao objeto que o contém - dados que foram declarados em uma superclasse.A vida estava bem.

class MyMonsterAI   { float const see_radius_; virtual void attack () = 0; /* .. */ };
class ElveAI        { ElveAI() : see_radius_(150.0f) {} /* ... */ };
class CycloneAI     { CycloneAI() : see_radius_(50.0f) {} /* ... */ };
class Monster       { MyMonsterAI* ai_; };

E veio o padrão Policy e me permitiria ainda maior flexibilidade no fornecimento de parâmetros para uma classe contendora - classes inteiras, equipadas como eu quisesse, embora trocando dinamicamente o comportamento...isso não foi muito fácil (a menos que parte da política fosse ter uma estratégia!).

class MyMonsterTrait { typedef typename ElveAI AI; };

template< class MonsterTrait >
class Monster : public MonsterTrait::AI
{
    void idle (void) { attack(); }
};

Ambos os padrões me parecem muito poderosos e gosto de usar ambos, em diferentes circunstâncias.Mas não tenho certeza se existem aplicações específicas/típicas/mais práticas para algumas situações.

Estou pensando:onde você usa estratégias e onde políticas?Onde eles são mais adequados?

Foi útil?

Solução

As políticas são amplamente definidas em tempo de compilação, enquanto as estratégias são definidas em tempo de execução.Além disso, as políticas são geralmente um conceito C++ e se aplicam apenas a uma minoria de outras linguagens (por exemplo, D), enquanto o padrão de estratégia está disponível para muitas (a maioria?) linguagens orientadas a objetos e linguagens que tratam funções como cidadãos de primeira classe, como python .

Dito isto:

  • Uma política, sendo determinada em tempo de compilação, geralmente só é útil para situações especiais em que você deseja lógica de aplicativo diferente por binário.Por exemplo, você pode desenvolver software ligeiramente personalizado para cada cliente, seja por meio de uma interface web ou manualmente, este seria um padrão baseado em políticas.

  • Uma estratégia é determinada em tempo de execução e, de fato, pode ser alterada instantaneamente.Por exemplo, você pode ter um software que implementa uma interface de usuário e uma lógica diferentes para a equipe de vendas e para o grupo de suporte, mas todos eles precisam lidar com o mesmo cliente e informações de licenciamento, portanto, em vez de ter dois aplicativos mantidos separadamente, você simplesmente tem um aplicativo cujo a interface muda conforme necessário.

-Adão

Outras dicas

Eu pensei que eles eram os mesma coisa.

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