Prof. Alexandre Bernardes
Introdução Conhecimento e as lições aprendidas por outros desenvolvedores que tiveram o mesmo problema de design e sobreviveram. Conhecer os padrões de projetos e depois avaliar os locais que possam ser aplicados.
Em vez da reutilização de código, com os padrões você obtém a reutilização de experiência.
2
Exemplo: Um jogo de simulação de lago com patos de grande sucesso SimUDuck. O jogo pode mostrar uma grande variedade de espécies de pato nadando e produzindo sons.
3
A partir de técnicas OO padrão, criaram: Duck quack() swim() display() //outros métodos parecidos com duck…
MallardDuck display() { //parece um pato bravo }
RedheadDuck display() { //parece um cabeça-vermelha}
Mas agora precisamos dos patos para voar
4
Mas agora precisamos dos patos para VOAR: Duck quack() swim() display() fly() //outros métodos parecidos com duck…
MallardDuck display() { //parece um pato bravo }
RedheadDuck display() { //parece um cabeça-vermelha}
Problema… 5 Agora patos de borracha também podem voar….
Ao colocar fly() na superclasse, ele deu capacidade de voar a TODOS os patos, incluindo os que não deveriam voar. Duck quack() swim() display() fly() //outros métodos parecidos com duck…
MallardDuck display() { //parece um pato bravo }
RedheadDuck
RubberDuck
display() { //parece um cabeça-vermelha}
quack() { //substituído por Squeak } fly(){ //substituir para fazer nada} display() { //parece um pato de borracha}
Patos de borracha não grasnam, então quack() é substituído por Squeak (guincho).
6
7 Desvantagem do uso de heranรงa para produzir o comportamento do pato.
Mudanças vão ocorrer constantemente no projeto Outra solução
O que acharam? 8
Péssima ideia.
Duplicação de código. Pois terá que fazer alteração no comportamento vôo de todas as 48 subclasses de vôo de Duck.
No desenvolvimento do Software haverá constantemente….
ALTERAÇÕES. 9
Quais motivos podem causar mudanรงas?
10
O que fazer agora? Princípio de Projeto.
Identifique os aspectos de seu aplicativo que variam e separe-os do que permanece igual
Então, pegue o que pode variar e “encapsule” para que isso não afete o resto de seu código.
11
Separar o que muda do que fica igual Esse conceito simples forma a base de quase todos
os padrões de projetos. Todos os padrões fornecem uma maneira de deixar
que alguma parte de um sistema varie independentemente de todas as outras partes.
12
Separando o que muda do que fica igual Problemas de alteração estão nos métodos fly() e quack() que variam entre os patos. Separar esses comportamentos da classe Duck e criar um novo conjunto de classes.
13
Separando o que muda do que fica igual
14
Separando o que muda do que fica igual Os comportamentos de Duck ficarão em uma classe separada. Assim, as classes de Duck não vão precisar conhecer nenhum detalhe de implementação para seus comportamentos.
15
Separando o que muda do que fica igual Será criada uma interface para representar cada comportamento – por exemplo, Flybehavior e QuackBehavior. E cada implementação de um comportamento irá implementar uma dessas interfaces. Exemplo:
16
Separando o que muda do que fica igual Dessa forma, as subclasses Duck irão usar um
comportamento representado por uma interface (FlyBehavior e QuackBehavior). A implementação real do comportamento não fique
presa na subclasse Duck.
17
18
Exemplo simples – para melhor entendimento.
19
20
Com este Projeto: Outros tipos de objetos podem reutilizar nossos
comportamentos de voar e grasnar porque esses comportamentos não são mais escondidos. Pode-se adicionar novos comportamentos sem modificar nenhuma de nossas classes de comportamento existentes ou, Ou trocar nenhuma classe Duck que utiliza comportamentos de vôo.
Então obtemos o benefício da reutilização sem toda a bagagem que vem com a herança. 21
Perguntas
P: Usando nosso projeto, o que voc锚 faria se precisasse adicionar um v么o de foguete ao aplicativo SimUPato? R: Criaria uma nova classe FlyRocketPowered que implementasse a interface FlyBehavior.
22
Integrando o comportamento de Duck 1º Adicionar duas variáveis de instância à classe Duck chamadas flyBehavior e quackBehavior.
24
Integrando o comportamento de Duck 2º Implementar o método performQuack():
Nessa parte do código, não importa com o tipo do objeto, só deseja-se saber se ele sabe grasnar (quack()). 25
Integrando o comportamento de Duck 3º Especificar comos as variáveis de instância flyBehavior e quackBehavior são definidas:
26
Implementado o MiniDucksSimulator
28
Implementado o MiniDucksSimulator
29
Implementado o MiniDucksSimulator
30
Implementado o MiniDucksSimulator
31
Implementado o MiniDucksSimulator
32
Configurando o comportamento de forma dinâmica 1º Adicionar dois métodos novos à classe:
34
Configurando o comportamento de forma dinâmica 2º Criar um novo tipo Duck (ModelDuck.java).
35
Configurando o comportamento de forma dinâmica 3º Criar um novo tipo FlyBehavior (FlyRocketPowered.java)
36
Configurando o comportamento de forma dinâmica 4º Alterar a classe de teste (principal e ativar o ModelDuck para foguete.
public class MiniDuckSimulator{ public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly(); Duck model = new ModelDuck(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly();
} } 37
Vis達o Geral do Projeto
38
Últimas Observações Cada pato tem um FlyBehavior e um QuackBehavior aos quais delega as capacidades de voar e de grasnar.
Ao unir as composição.
duas
classes
assim,
está
usando
Princípio de projeto • Dar prioridade à composição
39
Princípio de Projeto Usar composição dá muito mais flexibilidade. Encapsula uma família de algoritmos em seu próprio conjunto de classes. Além disso, permite alterar o comportamento no tempo de execução desde que o objeto com o qual você estiver compondo implemente a interface de comportamento.
40
Este foi o primeiro padrão de Projeto Padrão STRATEGY. • Define uma família de Algoritmos, encapsula cada um dele e os torna intercambiáveis. • A estratégia deixa o algoritmo variar independentemente dos clientes que o utilizam.
41
Qual a diferenรงa dos dois pedidos?
Vocabulรกrio Compartilhado!
42
O poder de um vocabulário de padrão compartilhado. Os vocabulários EFICAZES.
de
padrão
compartilhado
são
Os padrões permitem dizer mais com menos. Falar com padrões permite que você permaneça “no projeto” por mais tempo.
Vocabulários compartilhados podem turbinar sua equipe de desenvolvimento.
43
Exercício
45
46
Exemplo: Estação Meteorológica baseada na Internet de próxima geração. A estação meteorológica será baseada em nosso objeto
WeatherData, que monitora condições atuais do tempo (temperatura, umidade e pressão barométrica). Deseja-se criar um aplicativo que fornecesse inicialmente três elementos de exibição: Condições atuais, estatísticas meteorológicas e uma simples previsão, todos atualizados em tempo real à medida que o objeto WeatherData adquirir as medições mais recentes. Criar uma API para que outros desenvolvedores possam escrever seus próprios visores meteorológicos e os conectem. 48
Vis達o geral do aplicativo Weather Monitoring
49
Desempacotando a classe Weather Data
50
Tarefa a ser realizada
51
Tarefa a ser realizada
52
Primeira implementação – Será que é bom?
53
Com base em nossa primeira implementação, quais das seguintes opções se aplicam?
54
55
Define a dependĂŞncia um-para-muitos entre objetos para que quando um objeto mude de estado todos os seus dependentes sejam avisados e atualizados automaticamente.
Padrão Observer Possui: Subject (Sujeitos) Observers (Observadores) O sujeito e os observadores definem a relação um-para-muitos. Os observadores dependem do sujeito de modo que quando o
estado sujeito for alterado os observadores são avisados. Dependendo do estilo de notificação, o observador também pode ser atualizado com novos valores.
57
58
Conhecendo o Padr達o Observer
59
Conhecendo o Padr達o Observer
60
Conhecendo o Padr達o Observer
61
Conhecendo o Padr達o Observer
62
Conhecendo o Padr達o Observer
63
Conhecendo o Padr達o Observer
64
Conhecendo o Padr達o Observer
65
67
68
70
71
72
73
74
75
Bibliografia SIERRA, K. et al. Use a Cabeça! Padrões de Projetos. 2 ed. Alta Books: Rio de Janeiro, 2009.
76