Padrões de Projeto Aula 3 – Padrão Strategy PADRÃO STRATEGY 2 Padrões de Projeto - Strategy 3 Padrões de Projeto - Strategy Modelo • Atacar • Defender • Mover • Especificamente • Atacar • socar(), chutar() • Defender já é específico • Mover Padrões de Projeto - Strategy • Como vocês implementariam este jogo? • Conjunto de lutadores • andar(direção), pular(direção) 4 Padrões de Projeto - Strategy Modelo 5 Novas funcionalidades Padrões de Projeto - Strategy • Ambos os lutadores atiram! • Como devemos modelar esta nova funcionalidade? 6 Novas funcionalidades Padrões de Projeto - Strategy • Interfaces? 7 Novas Funcionalidades • • • • • Sub Zero (lança gelo) Rayden (lança raio) Shang Tsung (lança bola de fogo) Jax (lança bola de fogo) Liu Kang (lança bola de fogo) Padrões de Projeto - Strategy • Lançar magia! 8 9 Padrões de Projeto - Strategy Padrões de Projeto - Strategy Qual é a única coisa com a qual podemos contar sempre no desenvolvimento de software? ALTERAÇÃO 10 Separando o que muda do que fica igual • Quais comportamentos são imutáveis? • socar(), chutar(), defender(); • Quais comportamentos são mutáveis? • O que devemos fazer? • Separar o que muda do que fica igual! • Como? • Que tal criar um conjunto de classes (completamente separadas de Lutador) para cada comportamento? • Cada conjunto de classes irá conter todas as implementações possíveis para seu comportamento. • Ex.: teríamos uma classe para atirar com arma de fogo, outra classe para atirar flechas, etc. Padrões de Projeto - Strategy • atirar(), lancarMagia(); 11 Padrões de Projeto - Strategy Separando o que muda do que fica igual 12 Desenvolvendo os comportamentos de Lutador Padrões de Projeto - Strategy • Como vamos desenvolver o conjunto de classes que implementam os comportamentos de atirar e lançar magia? 13 Desenvolvendo os comportamentos de Lutador Padrões de Projeto - Strategy • Utilizaremos interfaces! 14 Pela 903284 vez: • PROGRAME para uma SUPERCLASSE! Padrões de Projeto - Strategy • 15 Padrões de Projeto - Strategy Integrando o comportamento de Lutador 16 17 Padrões de Projeto - Strategy TEM-UM pode ser melhor do que É-UM • Pra que serve a herança? • Resp.: um de seus objetivos é o reuso de código. • Resp.: Sim, através de composição! invés de herança... • Ao invés de herdar seus comportamentos, os lutadores obtêm seu comportamento ao serem compostos com o objeto de comportamento certo. • Sistemas que utilizam composição possuem muito mais flexibilidade do que os que usam herança. Lembre-se disto! • Conseguimos reuso de código de maneira flexível e com maior poder de manutenção. • A composição permite que os Lutadores alterem seu comportamento em tempo de execução. (lembra do Shang Tsung?) Padrões de Projeto - Strategy • Existe outra maneira de reutilizar código senão através da herança? puder, sempre use composição ao Quando 18 Exercício Padrões de Projeto - Strategy • Considerando o design que nós acabamos de modelar, implemente (papel) a classe Lutador e uma das seguintes classes, que É-UM Lutador: 19 Solução public NightWolf(){ comportamentoAtirador = new AtirarComArcoEFlecha(); comportamentoBruxo = new LancarNada(); } } Padrões de Projeto - Strategy class NightWolf extends Lutador{ 20 • Inicialmente eu achei que NightWolf não lançava magia (de verdade, eu não sabia...) • Aparentemente, ele (MK3) possui uma conexão muito forte com o Raiden (MK2), e lança raios em seus oponentes. Vamos considerar isso como uma magia. • Como deveríamos proceder para consertar NightWolf? Padrões de Projeto - Strategy Ops... 21 Fixing NightWolf public NightWolf(){ comportamentoAtirador = new AtirarComArcoEFlecha(); comportamentoBruxo = new LancarRaio(); } } Padrões de Projeto - Strategy class NightWolf extends Lutador{ 22 Questionamentos • Professor: Mais adiante aprenderemos alguns padrões para manter o nosso princípio de apenas programar para Superclasses. • Professor: Por enquanto, percebam que nós já ganhamos bastante flexibilidade, inclusive, nós podemos mudar o comportamento de cada lutador em tempo de execução através de métodos setters! Padrões de Projeto - Strategy • Aluno: Mas, professor, você não disse pra gente que nós deveríamos programar para uma superclasse? • Aluno: O construtor está apontando para implementações, ou seja, para classes concretas... Isso não seria errado? 23 • Você acaba de aplicar seu primeiro padrão de projeto: o padrão STRATEGY. • Com esse padrão, sempre que novos lutadores precisarem ser implementados e novos comportamentos surgirem, o nosso jogo estará pronto para qualquer alteração. O padrão STRATEGY define uma família de algoritmos, encapsula cada um deles e os torna polimórficos. Cada família de algoritmos contém diferentes estratégias para execução, que podem variar dependendo dos clientes que a utilizarem. Padrões de Projeto - Strategy E por falar em Padrões de Projetos... 24 Para casa 1 • Adicione à classe Lutador uma variável chamada “Vida”; • Pode ser um int com valor máximo 100; • • • • • • • Tiro com arma de fogo: -5 Tiro com flecha: -4 Bola de fogo (magia): -10 Bola de gelo (magia): -5 Raio (magia): -10 Soco: -3 Chute: -3 Padrões de Projeto - Strategy • Considere os seguintes danos para os seguintes ataques: • Crie um main onde os lutadores duelam até a morte! 25 Para casa 2 • Já que o gabarito da atividade anterior foi dado, experimente criar: • Novos lutadores: só estão criados nightwolf e subzero, você poderia criar mais 2 lutadores e fazer seu próprio duelo; • Novos tipos de comportamento: que tal criar o ComportamentoLancarObjeto? • KungLao lança seu chapéu; • Nightwolf também lança um machado. • Perguntas • Reflita o quanto o padrão Strategy lhe ajudou a executar o “polimorfismo” de Shang Tsung... Foi fácil ou difícil implementar essa funcionalidade com o novo padrão aprendido? Por que? • Foi fácil ou difícil criar um novo comportamento (laçar objetos) para os lutadores? Por que? Padrões de Projeto - Strategy • Minha sugestão seria criar o KungLao e o ShangTsun. • Para o ShangTsung, faça ele mudar de personagem ao longo do jogo. 26 Para casa 3 Padrões de Projeto - Strategy • Chega de Mortal Kombat... Quer entender melhor ainda esse padrão? Pratique um pouco mais... Implemente o seu próprio jogo! Sugiro que implementem o Street Fighter... Era muito legal.. Concordam? • Não se esqueçam de me mostrar o resultado! “Só se conhece o que se pratica.” - Barão de Montesquieu 27 Referências Padrões de Projeto - Strategy • O capítulo 1 do livro “Padrões de Projeto – Use a Cabeça!”; • O Mega Drive e a fita cartucho de Mortal Kombat III que tive quando criança foram grandes referências para essa aula. 28