SlideShare uma empresa Scribd logo
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

Guia do cftv básico
Guia do cftv   básicoGuia do cftv   básico
Guia do cftv básico
Erivan Andrade
 
Desenvolvimento agil de_software
Desenvolvimento agil de_softwareDesenvolvimento agil de_software
Desenvolvimento agil de_software
Eduardo Mendes
 
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
 
Html Aula 1 Parte 1
Html  Aula 1 Parte 1Html  Aula 1 Parte 1
Html Aula 1 Parte 1
Eduardo Mendes
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
Eduardo Mendes
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
Eduardo Mendes
 
Engenharia de Requisitos
Engenharia de RequisitosEngenharia de Requisitos
Engenharia de Requisitos
Eduardo Mendes
 
Rails - parte 1
Rails - parte 1Rails - parte 1
Rails - parte 1
Eduardo Mendes
 
Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4
Eduardo Mendes
 
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
Eduardo Mendes
 
Academia java intensivo
Academia java intensivoAcademia 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
Eduardo Mendes
 
Teste de Software - parte 1
Teste de Software - parte 1Teste de Software - parte 1
Teste de Software - parte 1
Eduardo Mendes
 
RSpec com doubles
RSpec com doublesRSpec com doubles
RSpec com doubles
Eduardo Mendes
 
Evolucao de software - parte 2
Evolucao de software - parte 2Evolucao de software - parte 2
Evolucao de software - parte 2
Eduardo Mendes
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
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
 
Evolucao de software - parte 1
Evolucao de software - parte 1Evolucao de software - parte 1
Evolucao de software - parte 1
Eduardo Mendes
 
Testes de Software parte 2
Testes de Software parte 2Testes de Software parte 2
Testes de Software parte 2
Eduardo Mendes
 
Jquery
JqueryJquery

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

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
Eduardo Mendes
 
AngularJS - Rotas
AngularJS - RotasAngularJS - Rotas
AngularJS - Rotas
Eduardo Mendes
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - Fundamentos
Eduardo Mendes
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
Eduardo Mendes
 
Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
Eduardo Mendes
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
Eduardo Mendes
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
Eduardo Mendes
 
ExtJS-4
ExtJS-4ExtJS-4
Jquery 2
Jquery 2Jquery 2
Jquery 2
Eduardo Mendes
 
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
Eduardo Mendes
 
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
Eduardo Mendes
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
Eduardo Mendes
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
Eduardo Mendes
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
Eduardo Mendes
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
Eduardo Mendes
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
Eduardo Mendes
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
Eduardo Mendes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantes
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
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - 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
 

Último

Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Gabriel de Mattos Faustino
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 

Último (8)

Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 

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