Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Padroes Template-Method (Método Gabarito)

1,778 views

Published on

Published in: Technology
  • Be the first to comment

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(){} }

×