Método Gabarito
(Template-Method)
Padrão Método-Gabarito
  Receita de Café
  Ferver um pouco de
água
  Misturar o café na água
fervente
  Servir o café ...
Transformando as bebidas em código
Cafe.java
public class Cafe {
public void prepararReceita(){
ferverAgua();
misturarCafe...
public class Cha {
public void prepararReceita(){
ferverAgua();
misturarChaComAgua();
servirNaXicara();
adicionarLimao();
...
Duplicação de código
  Devemos depurar o projeto
  Qual seria a melhor alternativa para evitar
essa duplicação?
Compare os códigos
public class Cafe {
public void prepararReceita(){
ferverAgua();
misturarCafeComAgua();
servirNaXicara(...
Sugestão para uma nova estrutura
Características
da nova estrutura
  O método prepararReceita() vai para a
superclasse e torna-se abstrato, pois ele é
dif...
Indo além
  O que mais há em comum?
  Receita de Café
  Ferver um pouco de água
  Misturar o café na água
fervente
  ...
Indo além
  O mesmo algoritmo?
  Ferver a água
  Misturar com água quente o café ou o chá
  Servir em uma xícara
  Ad...
Abstraindo o método
prepararReceita()
public class Cafe {
public void prepararReceita(){
ferverAgua();
misturarCafeComAgua...
O novo prepararReceita()
public final void prepararReceita() {
ferverAgua();
misturar();
servirNaXicara();
adicionarCondim...
A nova BebidaCafeinada.java
public abstract class BebidaCafeinada {
public final void prepararReceita() {
ferverAgua();
mi...
As novas bebidas
public class Café
extends BebidaCafeinada {
public void misturar() {
System.out.println(
"Misturando café...
A estrutura final
O que fizemos
Conhece e controla
o processo
O Método-Gabarito
(Template-Method)
  O Método-Gabarito define os passos de um
algoritmo e permite que a implementação de...
O antes e depois
  Antes
  As classes dispersas
controlavam o algoritmo
  Havia duplicação de código
  Toda alteração ...
+1 Padrão
TEMPLATE-METHOD(Método-Gabarito)
O Padrão Template-Method define o
esqueleto de um algoritmo dentro de um método...
Em miúdos
  O padrão consiste na criação de um gabarito.
  O que é um gabarito?
  Um método
  O método define um algor...
Diagrama de classes
metodo1();
metodo2();
Podem existir várias
subclasses concretas
A classe concreta implementa
os método...
Participantes
  Classe Abstrata
  Define as operações abstratas fundamentais que
as subclasses concretas definem para im...
Colaborações
  A Classe Concreta depende da Classe Abstrata
para implementar os passos invariantes do
algoritmo
O “gancho”
  Um método vazio:
  public void gancho() {}
public abstract class ClasseAbstrata {
public void metodoGabarit...
Upcoming SlideShare
Loading in …5
×

Padroes Template-Method (Método Gabarito)

1,087
-1

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,087
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
49
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Padroes Template-Method (Método Gabarito)

  1. 1. Método Gabarito (Template-Method)
  2. 2. Padrão Método-Gabarito   Receita de Café   Ferver um pouco de água   Misturar o café na água fervente   Servir o café na xícara   Acrescentar açúcar e leite   Receita de Chá   Ferver um pouco de água   Colocar o chá em infusão na água fervente   Despejar o chá na xícara   Acrescentar o limão 2 receitas bem parecidas
  3. 3. Transformando as bebidas em código Cafe.java public class Cafe { public void prepararReceita(){ ferverAgua(); misturarCafeComAgua(); servirNaXicara(); adicionarAcucarELeite(); } public void ferverAgua() { System.out.println("Agua Fervendo"); } public void misturarCafeComAgua() { System.out.println("Misturando café com água"); } public void servirNaXicara() { System.out.println("Servindo na xicara"); } public void adicionarAcucarELeite() { System.out.println("Adicionando acucar e leite"); } }   Receita de Café   Ferver um pouco de água   Misturar o café na água fervente   Servir o café na xícara   Acrescentar açuúcar e leite Cada 1 dos passos está implementado como um método
  4. 4. public class Cha { public void prepararReceita(){ ferverAgua(); misturarChaComAgua(); servirNaXicara(); adicionarLimao(); } public void ferverAgua() { System.out.println("Agua Fervendo"); } public void misturarChaComAgua(){ System.out.println("Mergulhando o cha"); } public void servirNaXicara() { System.out.println("Servindo na xicara"); } public void adicionarLimao() { System.out.println("Adicionando limão"); } } Agora o chá Cha.java Muito parecido com a sequência de código. O segundo e o quarto método são diferentes mas praticamente iguais.
  5. 5. Duplicação de código   Devemos depurar o projeto   Qual seria a melhor alternativa para evitar essa duplicação?
  6. 6. Compare os códigos public class Cafe { public void prepararReceita(){ ferverAgua(); misturarCafeComAgua(); servirNaXicara(); adicionarAcucarELeite(); } public void ferverAgua() { System.out.println("Agua Fervendo"); } public void misturarCafeComAgua() { System.out.println("Misturando café com água"); } public void servirNaXicara() { System.out.println("Servindo na xicara"); } public void adicionarAcucarELeite() { System.out.println("Adicionando acucar e leite"); } } public class Cha { public void prepararReceita(){ ferverAgua(); misturarChaComAgua(); servirNaXicara(); adicionarLimao(); } public void ferverAgua() { System.out.println("Agua Fervendo"); } public void misturarChaComAgua() { System.out.println("Mergulhando o cha"); } public void servirNaXicara() { System.out.println("Servindo na xicara"); } public void adicionarLimao() { System.out.println("Adicionando limão"); } }
  7. 7. Sugestão para uma nova estrutura
  8. 8. Características da nova estrutura   O método prepararReceita() vai para a superclasse e torna-se abstrato, pois ele é diferente nas duas classes   Cada subclasse sobrescreve o método prepararReceita()   Os métodos que são iguais – ferverAgua e servirNaXicara – são extraídos para a superclasse   Os métodos específicos de cada classes são implementados na própria subclasse
  9. 9. Indo além   O que mais há em comum?   Receita de Café   Ferver um pouco de água   Misturar o café na água fervente   Servir o café na xícara   Acrescentar açúcar e leite   Receita de Chá   Ferver um pouco de água   Colocar o chá em infusão na água fervente   Despejar o chá na xícara   Acrescentar o limão
  10. 10. Indo além   O mesmo algoritmo?   Ferver a água   Misturar com água quente o café ou o chá   Servir em uma xícara   Adicionar os condimentos da bebida Existe uma maneira de extrair para a superclasse o próprio prepararReceita()?
  11. 11. Abstraindo o método prepararReceita() public class Cafe { public void prepararReceita(){ ferverAgua(); misturarCafeComAgua(); servirNaXicara(); adicionarAcucarELeite(); } public class Cha { public void prepararReceita(){ ferverAgua(); misturarChaComAgua(); servirNaXicara(); adicionarLimao(); }
  12. 12. O novo prepararReceita() public final void prepararReceita() { ferverAgua(); misturar(); servirNaXicara(); adicionarCondimentos(); } Com o método final uma subclasse não podem sobrescrever o método e alterar a receita
  13. 13. A nova BebidaCafeinada.java public abstract class BebidaCafeinada { public final void prepararReceita() { ferverAgua(); misturar(); servirNaXicara(); adicionarCondimentos(); } abstract void misturar(); abstract void adicionarCondimentos(); public void ferverAgua() { System.out.println("Agua Fervendo"); } public void servirNaXicara() { System.out.println("Servindo na xicara"); } } Os métodos que são específicos serão implementados nas subclasses
  14. 14. As novas bebidas public class Café extends BebidaCafeinada { public void misturar() { System.out.println( "Misturando café"); } public void adicionarCondimentos() { System.out.println( "Adicionando acucar"); } } public class Cha extends BebidaCafeinada { public void misturar() { System.out.println( "Mergulhando o cha"); } public void adicionarCondimentos() { System.out.println( "Adicionando limão"); } }
  15. 15. A estrutura final
  16. 16. O que fizemos Conhece e controla o processo
  17. 17. O Método-Gabarito (Template-Method)   O Método-Gabarito define os passos de um algoritmo e permite que a implementação de um ou mais desses passos seja fornecida pela subclasse
  18. 18. O antes e depois   Antes   As classes dispersas controlavam o algoritmo   Havia duplicação de código   Toda alteração exigiria mudanças nas subclasses gerando múltiplas alterações   A organização das classes exige muito trabalho para adicionar uma nova bebida   As informações sobre o algoritmo e a sua forma de implementação está dispersa em muitas classes   Depois   A superclasse controla o algoritmo   A superclasse maximiza o o reuso através das subclasses   As mudanças no algoritmo ficam concentradas na superclasse   A superclasse fornece uma estrutura geral para criação de novas bebidas. Novas bebidas precisam implementar poucos métodos   A superclasse concentra o conhecimento sobre o algoritmo e confia às subclasses o fornecimento completo das implementações
  19. 19. +1 Padrão TEMPLATE-METHOD(Método-Gabarito) O Padrão Template-Method define o esqueleto de um algoritmo dentro de um método, transferindo alguns de seus passos para as subclasses. O Método-Gabarito permite que as subclasses redefinam certos passos de um algoritmo sem alterar a estrutura do mesmo.
  20. 20. Em miúdos   O padrão consiste na criação de um gabarito.   O que é um gabarito?   Um método   O método define um algoritmo como uma sequência de passos   Um ou mais passos podem ser redefinidos   A estrutura permanece a mesma
  21. 21. Diagrama de classes metodo1(); metodo2(); Podem existir várias subclasses concretas A classe concreta implementa os métodos abstratos O método gabarito está desacoplado da implementação dos métodos
  22. 22. Participantes   Classe Abstrata   Define as operações abstratas fundamentais que as subclasses concretas definem para implementar passos de um algoritmo   Implementa um método gabarito que define o esqueleto de um algoritmo   Classe Concreta   Implementa as operações fundamentais para executarem os passos específicos do algoritmo da subclasse
  23. 23. Colaborações   A Classe Concreta depende da Classe Abstrata para implementar os passos invariantes do algoritmo
  24. 24. O “gancho”   Um método vazio:   public void gancho() {} public abstract class ClasseAbstrata { public void metodoGabarito() { metodo1(); metodo2(); metodoConcreto(); gancho(); } abstract void metodo1(); abstract void metodo2(); final void metodoConcreto() { //implementacao... } void gancho(){} }
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×