sexta-feira, 5 de fevereiro de 2016

Design Pattern - Strategy

O conceito de estratégia, em grego strateegia, em latim strategi, em francês stratégie... Os senhores estão anotando? Vou pedir isso na prova. ...em inglês strategy, Em alemão strategie, em italiano strategia, em espanhol estrategia...

Segundo o GoF, a intenção do padrão Strategy é definir uma família de algoritmos, encapsular cada uma delas e torná-las intercambiáveis, permitindo assim que o algoritmo varie independentemente dos clientes que o utilizam.

Características:
- Define vários algoritmos;
- Encapsula cada um deles;
- Permite a troca de algoritmo independente do cliente.

O que eu ganho com isso?
Consigo criar novas estratégias a hora que eu quiser, sem ter que reescrever tudo ou  inserir mais um "if".

Onde eu aplico?
- Quando possuir diversas classes relacionadas que diferem somente no seu comportamento;
- Precisar variar um algoritmo;
- Um algoritmo usa dados que o cliente não precisa conhecer.
- Uma classe com muitos comportamentos e condicionais.

Benefícios:

- Evita o uso excessivo de condicionais.
- Permite expansão de maneira amigável.
- Desfruta dos prazeres da OO.

Prejuízos:
- Muitos objetos!
- Pode "sobrar" informações da interface.

 Mão na Massa

Strategy Pattern in UML (Wikipedia)

Conforme ilustra o diagrama de classe acima, o padrão de projeto Strategy funciona da seguinte maneira:

Dentro de um determinado contexto, você irá trabalhar com uma interface, desconhecendo a implementação, de maneira que diversas implementações possam ser realizadas. Como assim?

Elaborei a seguinte situação para tentar aplicar e exemplificar o Strategy:

Há uma banda, onde cada músico toca um instrumento, cada instrumento possui a sua maneira de emitir som, por este motivo, o "algoritmo de como emitir som" estará encapsulado em cada instrumento, e o músico necessitará apenas "tocar" este instrumento.

Para concretizar esta implementação necessitaremos dos seguintes ingredientes:

1 Interface:
N Classes que implementem a Interface em questão;
1 Contexto utilizando métodos da Interface;
Misture tudo e leve ao fogo alto!
Beleza, mas e agora?
Agora nós podemos adicionar novos instrumentos sem grandes dificuldades, basta que cada instrumento implemente a interface "Instrumento Musical", com isso a classe "Músico" se mantém intacta e consegue tocar qualquer instrumento que implemente a interface em questão.

Fechou o caneco? Estou aprendendo, portanto se houver algo de errado, mande brasa e vamos corrigir juntos esta bagaça!

Nenhum comentário:

Postar um comentário