padrões de projeto aula 3 – padrão strategy. padrÃo strategy padrões de projeto - strategy 2
TRANSCRIPT
Padrões de ProjetoAula 3 – Padrão Strategy
PADRÃO STRATEGY
Padr
ões d
e Pr
ojet
o - S
trat
egy
2
Padr
ões d
e Pr
ojet
o - S
trat
egy
3
Padr
ões d
e Pr
ojet
o - S
trat
egy
Modelo• Como vocês implementariam este jogo?• Conjunto de lutadores• Atacar• Defender• Mover
• Especificamente• Atacar
• socar(), chutar()• Defender já é específico• Mover
• andar(direção), pular(direção)
4
Padr
ões d
e Pr
ojet
o - S
trat
egy
Modelo
5
Padr
ões d
e Pr
ojet
o - S
trat
egy
Novas funcionalidades• Ambos os lutadores atiram!• Como devemos modelar esta nova funcionalidade?
6
Padr
ões d
e Pr
ojet
o - S
trat
egy
Novas funcionalidades• Interfaces?
7
Padr
ões d
e Pr
ojet
o - S
trat
egy
Novas Funcionalidades• Lançar magia!• 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)
8
Padr
ões d
e Pr
ojet
o - S
trat
egy
9
Padr
ões d
e Pr
ojet
o - S
trat
egy
Qual é a única coisa com a qual podemos contar sempre no desenvolvimento de software?
ALTERAÇÃO10
Padr
ões d
e Pr
ojet
o - S
trat
egy
Separando o que muda do que fica igual• Quais comportamentos são imutáveis?• socar(), chutar(), defender();
• Quais comportamentos são mutáveis?• atirar(), lancarMagia();
• 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.11
Padr
ões d
e Pr
ojet
o - S
trat
egy
Separando o que muda do que fica igual
12
Padr
ões d
e Pr
ojet
o - S
trat
egy
Desenvolvendo os comportamentos de Lutador• Como vamos desenvolver o conjunto de classes que
implementam os comportamentos de atirar e lançar magia?
13
Desenvolvendo os comportamentos de Lutador• Utilizaremos interfaces!
Padr
ões d
e Pr
ojet
o - S
trat
egy
14
Padr
ões d
e Pr
ojet
o - S
trat
egy
15
• Pela 903284 vez:• PROGRAME para uma SUPERCLASSE!
Padr
ões d
e Pr
ojet
o - S
trat
egy
Integrando o comportamento de Lutador
16
Padr
ões d
e Pr
ojet
o - S
trat
egy
17
Padr
ões d
e Pr
ojet
o - S
trat
egy
TEM-UM pode ser melhor do que É-UM• Pra que serve a herança?• Resp.: um de seus objetivos é o reuso de código.
• Existe outra maneira de reutilizar código senão através da herança?• Resp.: Sim, através de composição!• 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.• 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?)18
Quando puder, sempre use composição ao invés de herança...
Lembre-se disto!
Padr
ões d
e Pr
ojet
o - S
trat
egy
Exercício• Considerando o design que nós acabamos de modelar,
implemente (papel) a classe Lutador e uma das seguintes classes, que É-UM Lutador:
19
Padr
ões d
e Pr
ojet
o - S
trat
egy
Solução
20
class NightWolf extends Lutador{
public NightWolf(){comportamentoAtirador = new AtirarComArcoEFlecha();comportamentoBruxo = new LancarNada();
}
}
Padr
ões d
e Pr
ojet
o - S
trat
egy
Ops...• 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?
21
Padr
ões d
e Pr
ojet
o - S
trat
egy
Fixing NightWolf
22
class NightWolf extends Lutador{
public NightWolf(){comportamentoAtirador = new AtirarComArcoEFlecha();comportamentoBruxo = new LancarRaio();
}
}
Padr
ões d
e Pr
ojet
o - S
trat
egy
Questionamentos• 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?
• 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! 23
Padr
ões d
e Pr
ojet
o - S
trat
egy
E por falar em Padrões de Projetos...• 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.
24
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 d
e Pr
ojet
o - S
trat
egy
Para casa 1• Adicione à classe Lutador uma variável chamada “Vida”;• Pode ser um int com valor máximo 100;
• Considere os seguintes danos para os seguintes ataques:• 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
• Crie um main onde os lutadores duelam até a morte!25
Padr
ões d
e Pr
ojet
o - S
trat
egy
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;• Minha sugestão seria criar o KungLao e o ShangTsun. • Para o ShangTsung, faça ele mudar de personagem ao longo do jogo.
• 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?
26
Padr
ões d
e Pr
ojet
o - S
trat
egy
Para casa 3• 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! 27
“Só se conhece o que se pratica.”- Barão de Montesquieu
Padr
ões d
e Pr
ojet
o - S
trat
egy
Referências• 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