SlideShare uma empresa Scribd logo
1 de 24
Baixar para ler offline
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é 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
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
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.
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();
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");
}
}
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 é
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
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
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()?
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();
}
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
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
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");
}
}
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
um ou mais desses passos seja fornecida pela
subclasse
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
+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.
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
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
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
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 metodoGabarito() {
metodo1();
metodo2();
metodoConcreto();
gancho();
}
abstract void metodo1();
abstract void metodo2();
final void metodoConcreto() {
//implementacao...
}
void gancho(){}
}

Mais conteúdo relacionado

Destaque

Fábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoFábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de Projeto
Eduardo Mendes
 
Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2
Eduardo Mendes
 

Destaque (20)

Guia do cftv básico
Guia do cftv   básicoGuia do cftv   básico
Guia do cftv básico
 
Desenvolvimento agil de_software
Desenvolvimento agil de_softwareDesenvolvimento agil de_software
Desenvolvimento agil de_software
 
Fábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoFábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de Projeto
 
Html Aula 1 Parte 1
Html  Aula 1 Parte 1Html  Aula 1 Parte 1
Html Aula 1 Parte 1
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Engenharia de Requisitos
Engenharia de RequisitosEngenharia de Requisitos
Engenharia de Requisitos
 
Rails - parte 1
Rails - parte 1Rails - parte 1
Rails - parte 1
 
Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4
 
Introdução à Linguagem Ruby - Fundamentos - Parte 2
 Introdução à Linguagem Ruby - Fundamentos - Parte 2 Introdução à Linguagem Ruby - Fundamentos - Parte 2
Introdução à Linguagem Ruby - Fundamentos - Parte 2
 
Academia java intensivo
Academia java intensivoAcademia java intensivo
Academia java intensivo
 
Desenvolvimento Web com PHP parte 7
Desenvolvimento Web com PHP parte 7Desenvolvimento Web com PHP parte 7
Desenvolvimento Web com PHP parte 7
 
Teste de Software - parte 1
Teste de Software - parte 1Teste de Software - parte 1
Teste de Software - parte 1
 
RSpec com doubles
RSpec com doublesRSpec com doubles
RSpec com doubles
 
Evolucao de software - parte 2
Evolucao de software - parte 2Evolucao de software - parte 2
Evolucao de software - parte 2
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2
 
Evolucao de software - parte 1
Evolucao de software - parte 1Evolucao de software - parte 1
Evolucao de software - parte 1
 
Testes de Software parte 2
Testes de Software parte 2Testes de Software parte 2
Testes de Software parte 2
 
Jquery
JqueryJquery
Jquery
 

Mais de Eduardo Mendes

Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de Projeto
Eduardo Mendes
 

Mais de 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
 
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
 
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
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantes
 
Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de Projeto
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de Projeto
 

Padroes Template-Method (Método Gabarito)

  • 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. 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. 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. Duplicação de código   Devemos depurar o projeto   Qual seria a melhor alternativa para evitar essa duplicação?
  • 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. Sugestão para uma nova estrutura
  • 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. 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. 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. 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. 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. 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. 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"); } }
  • 16. O que fizemos Conhece e controla o processo
  • 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. 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. +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. 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. 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. 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. Colaborações   A Classe Concreta depende da Classe Abstrata para implementar os passos invariantes do algoritmo
  • 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(){} }