padroes template-method (método gabarito)

24
Método Gabarito (Template-Method)

Upload: eduardo-mendes-de-oliveira

Post on 26-Jun-2015

894 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Padroes Template-Method (Método Gabarito)

Método Gabarito (Template-Method)

Page 2: Padroes Template-Method (Método Gabarito)

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

Page 3: Padroes Template-Method (Método Gabarito)

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

Page 4: Padroes Template-Method (Método Gabarito)

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.

Page 5: Padroes Template-Method (Método Gabarito)

Duplicação de código   Devemos depurar o projeto   Qual seria a melhor alternativa para evitar

essa duplicação?

Page 6: Padroes Template-Method (Método Gabarito)

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"); } }

Page 7: Padroes Template-Method (Método Gabarito)

Sugestão para uma nova estrutura

Page 8: Padroes Template-Method (Método Gabarito)

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

Page 9: Padroes Template-Method (Método Gabarito)

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

Page 10: Padroes Template-Method (Método Gabarito)

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()?

Page 11: Padroes Template-Method (Método Gabarito)

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

Page 12: Padroes Template-Method (Método Gabarito)

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

Page 13: Padroes Template-Method (Método Gabarito)

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

Page 14: Padroes Template-Method (Método Gabarito)

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"); } }

Page 15: Padroes Template-Method (Método Gabarito)

A estrutura final

Page 16: Padroes Template-Method (Método Gabarito)

O que fizemos

Conhece e controla o processo

Page 17: Padroes Template-Method (Método Gabarito)

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

Page 18: Padroes Template-Method (Método Gabarito)

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

Page 19: Padroes Template-Method (Método Gabarito)

+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.

Page 20: Padroes Template-Method (Método Gabarito)

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

Page 21: Padroes Template-Method (Método Gabarito)

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

Page 22: Padroes Template-Method (Método Gabarito)

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

Page 23: Padroes Template-Method (Método Gabarito)

Colaborações   A Classe Concreta depende da Classe Abstrata

para implementar os passos invariantes do algoritmo

Page 24: Padroes Template-Method (Método Gabarito)

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