Padrões de Projeto - Template Method

Boa noite, pessoal.

Estou tendo uma certa dificuldade para entender o funcionamento do Template Method.

Vi que ele se diferencia de uma classe abstrata qualquer porque encapsula o código de um método abstrato.

Estava vendo o seguinte exemplo:

[code]package br.com.camilolopes.templatemethod;
/*

  • classe que tem os template method baseados
  • em métodos abstratos
    */
    public abstract class Conta {
    private double saldo;

public void deposita(double valor){
saldo = valor;
}
public void saque(double valor){
saldo -=valor;
saldo -=this.taxaConta();
}
//cada conta tem uma taxa diferente
public abstract double taxaConta();

public double getSaldo() {
return saldo;
}
}[/code]

No caso desse, o uso do Template estaria em

public void saque(double valor){ saldo -=valor; saldo -=this.taxaConta(); }

Correto? Pois o taxaConta() é um método abstrato e será definido nas subclasses que virão.

O que não entendo é porque desse encapsulamento. Eu estou chamando um método abstrato de certa classe através de um método da mesma classe (uma classe abstrata).

Acho que perdi o jeito depois da greve das universidades. :lol:

Alguém pode me dar uma breve explicação e/ou exemplos de fácil entendimento?

Grato.

Tentando melhorar um pouco:

Uma classe abstrata implenta alguns métodos e algum(ns) desse(s) método(s) chama um outro método abstrato (que será definido nas subclaesses).

É isso, correto? Eu entendo que está sendo feito, mas não entendo o motivo. E fica um pouco confuso de diferenciar de uma classe abstrata (normal) usando de herança.

Tem esse exemplo em java
http://brizeno.wordpress.com/2011/09/18/mao-na-massa-template-method/

Tem esse exemplo muito bem explicativo mas o código está em c# mas está muito parecido com java
http://www.devmedia.com.br/patterns-template-method/18953

Tem também o livro Use a cabeça padrões de projeto ajuda muito

http://www.livrariasaraiva.com.br/produto/1995765/use-a-cabeca-!-padroes-de-projetos-(design-patterns)-2-ed-revisada

[quote=rcarauta]Tem esse exemplo em java
http://brizeno.wordpress.com/2011/09/18/mao-na-massa-template-method/

Tem esse exemplo muito bem explicativo mas o código está em c# mas está muito parecido com java
http://www.devmedia.com.br/patterns-template-method/18953

Tem também o livro Use a cabeça padrões de projeto ajuda muito

http://www.livrariasaraiva.com.br/produto/1995765/use-a-cabeca-!-padroes-de-projetos-(design-patterns)-2-ed-revisada[/quote]

Vou dar uma olhada. Muito obrigado.

oi,

o Template Method é um padrão do tipo comportamental que extrai um comportamento/algoritmo comum a um conjunto de objetos relacionados.

a idéia básica é que a sua classe pai tenha o algoritmo/metodo/comportamento comum a todos os filhos e cabe a cada filho implementar o algoritimo/metodo/comportamento especifico de cada um.

isso é feito usando métodos abstratos e métodos concretos, uma classe abstrata pode possuir os dois, aqueles que forem concretos nao tem como modificador a palavra abstrato antes do metodo

abs

[quote=André Fonseca]oi,

o Template Method é um padrão do tipo comportamental que extrai um comportamento/algoritmo comum a um conjunto de objetos relacionados.

a idéia básica é que a sua classe pai tenha o algoritmo/metodo/comportamento comum a todos os filhos e cabe a cada filho implementar o algoritimo/metodo/comportamento especifico de cada um.

isso é feito usando métodos abstratos e métodos concretos, uma classe abstrata pode possuir os dois, aqueles que forem concretos nao tem como modificador a palavra abstrato antes do metodo

abs[/quote]

André, mas aí em nada se diferencia o uso do Template Method com uma classe abstrata qualquer? Pra ser Template Method não preciso chamar um método abstrato dentro de algum outro método na superclasse?

Eu tô dando uma olhada no exemplo que o colega acima postou. Parece bom. Vou olhar com mais calma logo mais.

[quote=André Fonseca]oi,

o Template Method é um padrão do tipo comportamental que extrai um comportamento/algoritmo comum a um conjunto de objetos relacionados.

a idéia básica é que a sua classe pai tenha o algoritmo/metodo/comportamento comum a todos os filhos e cabe a cada filho implementar o algoritimo/metodo/comportamento especifico de cada um.

isso é feito usando métodos abstratos e métodos concretos, uma classe abstrata pode possuir os dois, aqueles que forem concretos nao tem como modificador a palavra abstrato antes do metodo

abs[/quote]

André, mas aí em nada se diferencia o uso do Template Method com uma classe abstrata qualquer? Pra ser Template Method não preciso chamar um método abstrato dentro de algum outro método na superclasse?

Eu tô dando uma olhada no exemplo que o colega acima postou. Parece bom. Vou olhar com mais calma logo mais.

[quote=kxmm]

André, mas aí em nada se diferencia o uso do Template Method com uma classe abstrata qualquer? Pra ser Template Method não preciso chamar um método abstrato dentro de algum outro método na superclasse?

Eu tô dando uma olhada no exemplo que o colega acima postou. Parece bom. Vou olhar com mais calma logo mais. [/quote]

Quando você declara um método como abstrato ele obrigatoriamente deve se implementado na classe filha a não ser que ela também seja declarada como abstrata.
Uma classe abstrata possui pelo menos um método abstrato, mas ela também pode possuir métodos concretos (sem usar o modificador abstract)

Um padrão é usado para resolver um problema específico, o que eu te falei é “para que” serve este padrão. A forma como voce implementa este padrão pode variar.

abs

[quote=André Fonseca][quote=kxmm]

André, mas aí em nada se diferencia o uso do Template Method com uma classe abstrata qualquer? Pra ser Template Method não preciso chamar um método abstrato dentro de algum outro método na superclasse?

Eu tô dando uma olhada no exemplo que o colega acima postou. Parece bom. Vou olhar com mais calma logo mais. [/quote]

Quando você declara um método como abstrato ele obrigatoriamente deve se implementado na classe filha a não ser que ela também seja declarada como abstrata.
Uma classe abstrata possui pelo menos um método abstrato, mas ela também pode possuir métodos concretos (sem usar o modificador abstract)

Um padrão é usado para resolver um problema específico, o que eu te falei é “para que” serve este padrão. A forma como voce implementa este padrão pode variar.

abs[/quote]

Entendi sobre classes abstratas. Mas talvez eu não esteja me fazendo entender. Vou tentar exemplificar:

Digamos que exista uma classe abstrata chamada “FabricarTravesseiros”.

Há dois tipos de travesseiros: os de espumas e os de penas.

Na classe FabricarTravesseiros eu posso criar um método abstrato chamado “encherTravesseiro”, pois é comum aos dois tipos de travesseiros.

Depois, nas classes travesseiroEspuma e travesseiroPena eu defino o método “encherTravesseiro”.

Isso é uso de classe abstrata. Correto? Há Tamplate Method aí? Porque, pelos exemplos que vi, o Template Method precisa chamar um método abstrato dentro da classe abstrata.

Como nesse exemplo:

[code]public abstract class Conta {
private double saldo;

public void deposita(double valor){
saldo = valor;
}
public void saque(double valor){
saldo -=valor;
saldo -=this.taxaConta();
}
//cada conta tem uma taxa diferente
public abstract double taxaConta();

public double getSaldo() {
return saldo;
}
}[/code]

Na classe Conta, que é abstrata, estão definidos alguns métodos concretos e um método abstrato, o taxaConta(). Mas há um método (o saque) chamando o taxaConta(), mesmo que o taxaConta() só sera definidos nas subclasses.
Eu só não tô entendo se pra ser Template Method eu preciso ou não dessa chamada.

oi,

Sim, a idéia é de que a classe pai saiba como o algoritimo funciona, ou seja, a sequencia de passos ou chamada de métodos que devem ser feitas para implementação deste algoritmo

os métodos que não são abstratos da classe pai são os verdadeiros métodos de template (também podem ser sobrescritos se voce quiser), correspondem ao comportamento comum a todos

os métodos que são abstratos da classe pai são chamdos de métodos primitivos e devem ser sobrescritos nas classes filhas, correspondem ao comportamento especifico dos filhos

não se preocupe tanto com a implementação do padrão, se preocupe em entender qual a finalidade dele e quando usar, como eu falei existem várias formas de implementação

abs

[quote=André Fonseca]oi,

Sim, a idéia é de que a classe pai saiba como o algoritimo funciona, ou seja, a sequencia de passos ou chamada de métodos que devem ser feitas para implementação deste algoritmo

os métodos que não são abstratos da classe pai são os verdadeiros métodos de template (também podem ser sobrescritos se voce quiser), correspondem ao comportamento comum a todos

os métodos que são abstratos da classe pai são chamdos de métodos primitivos e devem ser sobrescritos nas classes filhas, correspondem ao comportamento especifico dos filhos

não se preocupe tanto com a implementação do padrão, se preocupe em entender qual a finalidade dele e quando usar, como eu falei existem várias formas de implementação

abs[/quote]

Eu preciso compreender bem a finalidade e a implementação. É pra um seminário.

Muito obrigado pela ajuda.

Vou elaborar um exemplo e o código para usar na apresentação, depois o coloco aqui e, se você puder, quero que me auxilie e corrija caso tenha algo errado.

Novamente, obrigado. Abraço.

[quote=André Fonseca]oi,

Sim, a idéia é de que a classe pai saiba como o algoritimo funciona, ou seja, a sequencia de passos ou chamada de métodos que devem ser feitas para implementação deste algoritmo

os métodos que não são abstratos da classe pai são os verdadeiros métodos de template (também podem ser sobrescritos se voce quiser), correspondem ao comportamento comum a todos

os métodos que são abstratos da classe pai são chamdos de métodos primitivos e devem ser sobrescritos nas classes filhas, correspondem ao comportamento especifico dos filhos

não se preocupe tanto com a implementação do padrão, se preocupe em entender qual a finalidade dele e quando usar, como eu falei existem várias formas de implementação

abs[/quote]

Fala Galera.

Eu imaginei que só seria considerado Template Method, se a classe abstrata tivesse um método concreto chamando um método abstrato.

Me ajudou muito, valeu!