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
Download

Padrão Strategy