SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
Jogo com Patos
  A simulação de um lago com patos
  SimUPato
  Grande variedade de espécies
  Técnicas OO
  Superclasse: Pato
  Herdada por todos os outros tipos de pato
Começando com Padrões
• Todos os patos grasnam e
nadam
• A superclasse cuida da
implementação
grasnar()
nadar()
exibirNaTela()
//Outros métodos
•  O método
exibirNaTela() é
abstrato já que todos
os subtipos de pato são
diferentes
Mais classes...
Requisitos
  Alteração nos Requisitos
  ADICIONAR PATOS QUE PRECISAM VOAR
Começando com Padrões
grasnar()
nadar()
exibirNaTela()
voar()
• Adiciona-se o método
voar e todas as
subclasses herdam
Começando com Padrões
grasnar()
nadar()
exibirNaTela()
voar()
Problemas
  O que pode parecer ser um excelente uso para
a herança para fins de reutilização pode não ser
tão eficiente quando se trata de manutenção
  Problema
  Nem todas as classes deveriam voar
  Uma atualização localizada no código causou um
efeito colateral não local
  Patos de borracha voadores
Opções
  Sobrescrever o método voar() do pato de
borracha
  Que tal uma interface?????
nadar()
exibirNaTela()
A Constante no
desenvolvimento de software
A L T E R A Ç Ã O
HERANÇA
  A HERANÇA não funcionou muito bem
  Comportamento de patos ficam sempre alterando
  Nem todas as subclasses necessitam ter o mesmo
comportamento
  Interfaces parecem “OK”
  Não possuem implementação
  Não há reutilização de código
  Sempre que modificar o comportamento
  Monitoração
  Alteração
Princípio de Design
  “Identifique os aspectos de seu aplicativo que
variam e separe-os do que permanece igual”
  Pegue o que variar e “encapsule” para que isso
não afete o restante do código
  Menos conseqüências indesejadas
  Mais flexibilidade
Mesma coisa
  “Pegue as partes que variam e encapsule-as
para depois poder alterar ou estender as partes
que variam sem afetar as que não variam”
  Base de quase todos os padrões de projeto
  Hora de voltar aos patos
Aos patos
  O que está variando?
  voar()
  grasnar()
  Criaremos dois conjuntos de classes
  Totalmente separados
  1º  Voar
  2º  Grasnar
  Cada conjunto contém todas as implementações
possíveis de comportamento
Retira-se os métodos da classe
e cria-se classes para estes comportamentos
Classe Pato
Comportamentos
de vôo
Comportamentos
de grasnar
Flexibilidade
  Como desenvolver comportamento e manter a
flexibilidade?
  Podemos alterar o comportamento de forma
dinâmica?
  É possível alterar o comportamento em tempo
de execução?
Princípio de Design
  “Programe para uma interface e não para uma
implementação”
  Utilizaremos interfaces para representar o cada
comportamento:
O que é diferente???
  Não é a classe Pato que implementa o
comportamento
  Não existe uma implementação concreta destes
comportamentos na classe Pato
  Isso nos deixava preso a estas implementações
específicas
  As classes Pato irão usar um comportamento
externo
Programar para uma interface
  Significa
  Programar para um supertipo
  É possível programar desta maneira sem usar
uma interface em Java
  Polimorfismo
  O tipo declarado  supertipo
  Exemplo 
Programando
Interface x Implementação
  Para Implementação:
Cachorro c = new Cachorro();
c.latir();
Programando
Interface x Implementação
  Para interface/
supertipo:
Animal c = new Cachorro();
c.fazerBarulho();
Programando
Interface x Implementação
  Melhorando
Animal c = getAnimal();
c.fazerBarulho();
Implementando os comportamentos
Integrando o comportamento
  Adicionar 2 variáveis de instância ao Pato
ModoDeVoar modoDeVoar
ModoDeGrasnar modeDeGrasnar
nadar()
exibirNaTela()
executarGrasno()
executarVoo()
Integrando o comportamento
  Implementamos, por exemplo, o executarGrano()
public class Pato {
ModoDeGrasnar modoDeGrasnar;
public void executarGrasno() {
modoDeGrasnar.grasnar();
}
} Delegou o comportamento
para outra classe
Integrando o comportamento
  Como definir as variáveis de instância do
comportamento?
public class PatoSelvagem extends Pato {
public PatoSelvagem() {
modoDeVoar = new VoarComAsas();
modoDeGrasnar = new Quack();
}
public void exibirNaTela() {
System.out.println(“Eu sou um pato selvagem”);
}
}
Tudo junto
Verifica-se a composição
Princípio de Design
  “Dar prioridade à
composição ao invés da
herança”
  Maior flexibilidade
  Conjunto de algoritmos
encapsulados em uma
família de classes
  Alteração do
comportamento em
tempo de execução
Primeiro Padrão 
STRATEGY
Define uma família de algoritmos,
encapsula cada um deles e os torna
intercambiáveis. O Strategy permite que os
algoritmos variem independentemente dos
clientes que o utilizam.
Strategy
Diagrama de Classes
Aplicabilidade
  Use o padrão Strategy quando:
  Muitas classes relacionadas diferem somente no seu
comportamento
  O Strategy fornecem uma maneira de configurar uma classe com um,
dentre muitos comportamentos
  Precisa-se de variantes de um algoritmo
  Um algoritmo usa dados de que os clientes não deveriam
ter conhecimento
  O Strategy evita a exposição de estruturas de dados complexos
específicas de um algoritmo
  Uma classe define muitos comportamentos e estes
aparecem em suas operações como múltiplos comandos
condicionais da linguagem
  Mova os condicionais para sua classe Strategy
Participantes
  Context
  Possui uma referência para um objeto Strategy
  É configurado com um objeto ConcreteStrategy
  Pode definir uma interface que permite o Strategy acessar
seus dados
  Strategy
  Define uma interface comum para todos os algoritmos
suportados. Context usa esta interface para chamar um
algoritmo definido por um ConcreteStrategy
  ConcreteStrategy
  Implementa o algoritmo usando a interface Strategy
Colaborações
  Strategy e Context interagem para implementar
o algoritmo escolhido
  Um Context repassa solicitações dos seus
clientes para seu Strategy
Consequências
  Famílias de algoritmos relacionados
  Alternativa ao uso de subclasses
  Possibilidade da escolha de implementações
Consequências
  Os clientes devem conhecer diferentes
Strategies
  O cliente deve compreender qual a diferença entre
os Strategies
  Usar o padrão Strategy somente quando a variação
em comportamento é importante
  Custo de comunicação entre Strategy e Context
  Aumento do número de objetos

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Modelo de briefing
Modelo de briefingModelo de briefing
Modelo de briefing
 
MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料
MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料
MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
 
Metodologia ágil das Desenvolvimento Adaptativo Software
Metodologia ágil das   Desenvolvimento Adaptativo SoftwareMetodologia ágil das   Desenvolvimento Adaptativo Software
Metodologia ágil das Desenvolvimento Adaptativo Software
 
Tom de voz
Tom de vozTom de voz
Tom de voz
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
 
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudyJenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
 
ia-cloudとNodeREDで作る工場IoT–センサ接続やダッシュボードのカスタムNode開発秘話
ia-cloudとNodeREDで作る工場IoT–センサ接続やダッシュボードのカスタムNode開発秘話ia-cloudとNodeREDで作る工場IoT–センサ接続やダッシュボードのカスタムNode開発秘話
ia-cloudとNodeREDで作る工場IoT–センサ接続やダッシュボードのカスタムNode開発秘話
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
DynamoDB活用事例 株式会社マイネット
DynamoDB活用事例 株式会社マイネットDynamoDB活用事例 株式会社マイネット
DynamoDB活用事例 株式会社マイネット
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
Confluenceショートカットキー表 v1
Confluenceショートカットキー表 v1Confluenceショートカットキー表 v1
Confluenceショートカットキー表 v1
 
Engenharia de Software para Jogos
Engenharia de  Software para JogosEngenharia de  Software para Jogos
Engenharia de Software para Jogos
 
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
 
Curso HTML 5 - Aula com Formulários, Imagens, Áudio e Vídeo
Curso HTML 5 - Aula com Formulários, Imagens, Áudio e VídeoCurso HTML 5 - Aula com Formulários, Imagens, Áudio e Vídeo
Curso HTML 5 - Aula com Formulários, Imagens, Áudio e Vídeo
 
凝集度と責務
凝集度と責務凝集度と責務
凝集度と責務
 
バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri
バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuriバッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri
バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri
 
FlutterとSupabaseでRDBを使った サーバーレスアプリ開発
FlutterとSupabaseでRDBを使った サーバーレスアプリ開発FlutterとSupabaseでRDBを使った サーバーレスアプリ開発
FlutterとSupabaseでRDBを使った サーバーレスアプリ開発
 
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação WebDjango Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
 
Ihc2016.2 aula 7 critérios de qualidade de uso
Ihc2016.2 aula 7   critérios de qualidade de usoIhc2016.2 aula 7   critérios de qualidade de uso
Ihc2016.2 aula 7 critérios de qualidade de uso
 

Andere mochten auch

Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
ejdn1
 
Web Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLWeb Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQL
Otávio Calaça Xavier
 

Andere mochten auch (20)

Aula 04 - UML e Padrões de Projeto
Aula 04 - UML e Padrões de ProjetoAula 04 - UML e Padrões de Projeto
Aula 04 - UML e Padrões de Projeto
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
 
Padrões de Projeto para Jogos
Padrões de Projeto para JogosPadrões de Projeto para Jogos
Padrões de Projeto para Jogos
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
 
Observer - Padrões de projeto
Observer - Padrões de projetoObserver - Padrões de projeto
Observer - Padrões de projeto
 
Games, lado dev
Games, lado devGames, lado dev
Games, lado dev
 
Padrões de Projeto (GoF)
Padrões de Projeto (GoF)Padrões de Projeto (GoF)
Padrões de Projeto (GoF)
 
GWT revista espirito
GWT revista espiritoGWT revista espirito
GWT revista espirito
 
Adote OpenJDK
Adote OpenJDKAdote OpenJDK
Adote OpenJDK
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP Doctrine
 
Fundamentos de Java
Fundamentos de Java Fundamentos de Java
Fundamentos de Java
 
Conhecendo Java
Conhecendo JavaConhecendo Java
Conhecendo Java
 
Padrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e StrategyPadrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e Strategy
 
Web Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLWeb Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQL
 
Fundamentos de java herbert schildt
Fundamentos de java   herbert schildtFundamentos de java   herbert schildt
Fundamentos de java herbert schildt
 
Java - Aprenda rápido
Java - Aprenda rápidoJava - Aprenda rápido
Java - Aprenda rápido
 
Java para Leigos
Java para LeigosJava para Leigos
Java para Leigos
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com Hibernate
 
Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7
 
Academia do Arquiteto Globalcode
Academia do Arquiteto GlobalcodeAcademia do Arquiteto Globalcode
Academia do Arquiteto Globalcode
 

Ähnlich wie Strategy - Padrões de Projeto

Java 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesJava 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas Interfaces
Regis Magalhães
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
Anderson Ledo
 

Ähnlich wie Strategy - Padrões de Projeto (20)

Polimorfismo em java
Polimorfismo em javaPolimorfismo em java
Polimorfismo em java
 
Java 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesJava 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas Interfaces
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Strategy pattern
Strategy patternStrategy pattern
Strategy pattern
 
Aop Aspect J 1.5.4
Aop Aspect J 1.5.4Aop Aspect J 1.5.4
Aop Aspect J 1.5.4
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em Java
 
Ruby
RubyRuby
Ruby
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)
 
Introdução ao Java 5
Introdução ao Java 5Introdução ao Java 5
Introdução ao Java 5
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdf
 
Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2
 
Java11
Java11Java11
Java11
 
Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
Poo (1)
Poo (1)Poo (1)
Poo (1)
 
Apresentação final
Apresentação finalApresentação final
Apresentação final
 
Java1
Java1Java1
Java1
 
Refatorações
RefatoraçõesRefatorações
Refatorações
 
Linguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação JavaLinguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação Java
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
 

Mehr von Eduardo Mendes

Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
Eduardo Mendes
 

Mehr von Eduardo Mendes (20)

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
AngularJS - Rotas
AngularJS - RotasAngularJS - Rotas
AngularJS - Rotas
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - Fundamentos
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 
Html - Aula 3
Html - Aula 3Html - Aula 3
Html - Aula 3
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
 
ExtJS-4
ExtJS-4ExtJS-4
ExtJS-4
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Jquery
JqueryJquery
Jquery
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de Software
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 

Kürzlich hochgeladen

Kürzlich hochgeladen (8)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 

Strategy - Padrões de Projeto

  • 1.
  • 2. Jogo com Patos   A simulação de um lago com patos   SimUPato   Grande variedade de espécies   Técnicas OO   Superclasse: Pato   Herdada por todos os outros tipos de pato
  • 3. Começando com Padrões • Todos os patos grasnam e nadam • A superclasse cuida da implementação grasnar() nadar() exibirNaTela() //Outros métodos •  O método exibirNaTela() é abstrato já que todos os subtipos de pato são diferentes Mais classes...
  • 4. Requisitos   Alteração nos Requisitos   ADICIONAR PATOS QUE PRECISAM VOAR
  • 7. Problemas   O que pode parecer ser um excelente uso para a herança para fins de reutilização pode não ser tão eficiente quando se trata de manutenção   Problema   Nem todas as classes deveriam voar   Uma atualização localizada no código causou um efeito colateral não local   Patos de borracha voadores
  • 8. Opções   Sobrescrever o método voar() do pato de borracha
  • 9.   Que tal uma interface????? nadar() exibirNaTela()
  • 10. A Constante no desenvolvimento de software A L T E R A Ç Ã O
  • 11. HERANÇA   A HERANÇA não funcionou muito bem   Comportamento de patos ficam sempre alterando   Nem todas as subclasses necessitam ter o mesmo comportamento   Interfaces parecem “OK”   Não possuem implementação   Não há reutilização de código   Sempre que modificar o comportamento   Monitoração   Alteração
  • 12. Princípio de Design   “Identifique os aspectos de seu aplicativo que variam e separe-os do que permanece igual”   Pegue o que variar e “encapsule” para que isso não afete o restante do código   Menos conseqüências indesejadas   Mais flexibilidade
  • 13. Mesma coisa   “Pegue as partes que variam e encapsule-as para depois poder alterar ou estender as partes que variam sem afetar as que não variam”   Base de quase todos os padrões de projeto   Hora de voltar aos patos
  • 14. Aos patos   O que está variando?   voar()   grasnar()   Criaremos dois conjuntos de classes   Totalmente separados   1º  Voar   2º  Grasnar   Cada conjunto contém todas as implementações possíveis de comportamento
  • 15. Retira-se os métodos da classe e cria-se classes para estes comportamentos Classe Pato Comportamentos de vôo Comportamentos de grasnar
  • 16. Flexibilidade   Como desenvolver comportamento e manter a flexibilidade?   Podemos alterar o comportamento de forma dinâmica?   É possível alterar o comportamento em tempo de execução?
  • 17. Princípio de Design   “Programe para uma interface e não para uma implementação”   Utilizaremos interfaces para representar o cada comportamento:
  • 18. O que é diferente???   Não é a classe Pato que implementa o comportamento   Não existe uma implementação concreta destes comportamentos na classe Pato   Isso nos deixava preso a estas implementações específicas   As classes Pato irão usar um comportamento externo
  • 19. Programar para uma interface   Significa   Programar para um supertipo   É possível programar desta maneira sem usar uma interface em Java   Polimorfismo   O tipo declarado  supertipo   Exemplo 
  • 20. Programando Interface x Implementação   Para Implementação: Cachorro c = new Cachorro(); c.latir();
  • 21. Programando Interface x Implementação   Para interface/ supertipo: Animal c = new Cachorro(); c.fazerBarulho();
  • 22. Programando Interface x Implementação   Melhorando Animal c = getAnimal(); c.fazerBarulho();
  • 24. Integrando o comportamento   Adicionar 2 variáveis de instância ao Pato ModoDeVoar modoDeVoar ModoDeGrasnar modeDeGrasnar nadar() exibirNaTela() executarGrasno() executarVoo()
  • 25. Integrando o comportamento   Implementamos, por exemplo, o executarGrano() public class Pato { ModoDeGrasnar modoDeGrasnar; public void executarGrasno() { modoDeGrasnar.grasnar(); } } Delegou o comportamento para outra classe
  • 26. Integrando o comportamento   Como definir as variáveis de instância do comportamento? public class PatoSelvagem extends Pato { public PatoSelvagem() { modoDeVoar = new VoarComAsas(); modoDeGrasnar = new Quack(); } public void exibirNaTela() { System.out.println(“Eu sou um pato selvagem”); } }
  • 29. Princípio de Design   “Dar prioridade à composição ao invés da herança”   Maior flexibilidade   Conjunto de algoritmos encapsulados em uma família de classes   Alteração do comportamento em tempo de execução
  • 30. Primeiro Padrão  STRATEGY Define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis. O Strategy permite que os algoritmos variem independentemente dos clientes que o utilizam.
  • 32. Aplicabilidade   Use o padrão Strategy quando:   Muitas classes relacionadas diferem somente no seu comportamento   O Strategy fornecem uma maneira de configurar uma classe com um, dentre muitos comportamentos   Precisa-se de variantes de um algoritmo   Um algoritmo usa dados de que os clientes não deveriam ter conhecimento   O Strategy evita a exposição de estruturas de dados complexos específicas de um algoritmo   Uma classe define muitos comportamentos e estes aparecem em suas operações como múltiplos comandos condicionais da linguagem   Mova os condicionais para sua classe Strategy
  • 33. Participantes   Context   Possui uma referência para um objeto Strategy   É configurado com um objeto ConcreteStrategy   Pode definir uma interface que permite o Strategy acessar seus dados   Strategy   Define uma interface comum para todos os algoritmos suportados. Context usa esta interface para chamar um algoritmo definido por um ConcreteStrategy   ConcreteStrategy   Implementa o algoritmo usando a interface Strategy
  • 34. Colaborações   Strategy e Context interagem para implementar o algoritmo escolhido   Um Context repassa solicitações dos seus clientes para seu Strategy
  • 35. Consequências   Famílias de algoritmos relacionados   Alternativa ao uso de subclasses   Possibilidade da escolha de implementações
  • 36. Consequências   Os clientes devem conhecer diferentes Strategies   O cliente deve compreender qual a diferença entre os Strategies   Usar o padrão Strategy somente quando a variação em comportamento é importante   Custo de comunicação entre Strategy e Context   Aumento do número de objetos