Method Template

Hoje estava escrevendo um material pra ministrar minha aula no SergioYamada.com.br sobre DesignPatterns. Como observei que não havia nada sobre Template Method no WikiPedia (PT) resolvi colocar um trecho do material que pode ser conferido em:
http://pt.wikipedia.org/wiki/Template_Method

Porém...
Nem tudo é perfeito...
Em pouco tempo voltei ao link pra dar uma conferida, e encontrei essa mensagem:

Esta página foi proposta para eliminação rápida.
* Regra 20 - Artigos que encaixam no perfil de lixo ou impróprio.

20.1 - Desde que não seja o próprio proponente a eliminar o artigo.
20.2 - Confirmar no histórico se existem versões anteriores válidas.
20.3 - Em caso de dúvida sobre a validade do conteúdo, ou do título caso haja artigos afluentes, encaminhar a página para eliminação por votação em Páginas para eliminar.

* Proponente: Fabiano msg 23h38min de 9 de Agosto de 2007 (UTC)

A página será eliminada por um administrador se estiver em conformidade com a política de eliminação.

Administrador: não apagar a página apenas pela justificativa fazer sentido. Apague apenas se for caso de uma das 20 regras de eliminação rápida, devidamente preenchidas e de forma que se justifiquem. Em caso de dúvida deve-se propor para votação e avisar o proponente. Ver também as definições de Wikipedia:Lixo e Wikipedia:Impróprio.


puts... que chato


Bom... mas se o material não ficar no ar lá no wiki, então que pelo menos fique aqui:

== Lá Vai ==



Para entender este design pattern, pense em uma máquina de fazer café, mas que ela também sirva chocolate quente, e chá. Analise e reflita, oque estas três bebidas tem em comum, e oque elas tem de diferente?

Veja que todos “precisam” de açúcar, precisam ser aquecidos e misturados. O Method Template tem como finalidade aproveitar estas características em comum, de forma a permitir que cada bebida tenha também um comportamento específico.


package com.gms.designpattern.templatemethod;
import static java.lang.System.out;
public abstract class Bebida {
public String preparBebida(){
addAgua();
addAcucar();
addExtrato();
mecher();
return "Sua bebida está pronta!! \n".toUpperCase();
}
private void addAgua(){
out.println("Adicionando água...");
}
private void addAcucar(){
out.println("Adicionando Aúcar...");
}
private void mecher(){
out.println("Mechendo... Misturando...");
}
protected abstract void addExtrato();
}

package com.gms.designpattern.templatemethod;
import static java.lang.System.out;
public class Cafe extends Bebida {
@Override
protected void addExtrato() {
out.println("Adicinando extrato de café");
}
}

package com.gms.designpattern.templatemethod;
import static java.lang.System.out;
public class Chocolate extends Bebida {
@Override
protected void addExtrato() {
out.println("Adicinando extrato de chocolate...");
}
}

package com.gms.designpattern.templatemethod;
import static java.lang.System.out;
public class Cha extends Bebida{
@Override
protected void addExtrato() {
out.println("Adicinando extrato de chá...");
}
}

package com.gms.designpattern.templatemethod;
import static java.lang.System.out;
public class MaquinaDeBebidas {
public static void main(String [] args) {
Cafe cafe = new Cafe();
out.println(cafe.preparBebida());
out.println(new Chocolate().preparBebida());
out.println(new Cha().preparBebida());
}
}

Um comentário:

Neves disse...

Sempre em orientação objeto e design patterns o pessoal vem com exemplos básicos para ilustrar o conceito. Nada errado nisso. O problema é que eles sempre param por aí.

Cara, tenho um desafio pra você. Achar uma solução real onde se aplica orientação objeto ou design patterns que o programador procedural olhe e diga: "Nossa, aí sim eu vi vantagem!"

Compreende?