terça-feira, 9 de novembro de 2010

Template Method

Template Method

Definição
Definir um esqueleto de um algoritmo em uma operação, postergando alguns passos para subclasses. Template method permite que subclasses redefinam certos passos de um algoritmo sem mudar a estrutura do  mesmo. As subclasses devem se responsabilizar por estas partes abstratas, deste algoritmo, que serão implementadas, possivelmente de várias formas, ou seja, cada subclasse irá implementar à sua necessidade e oferecer um comportamento concreto construindo todo o algoritmo.


Quando usar
·        Para implementar as partes invariantes de um algoritmo uma só vez  deixar para as subclasses a implementação do comportamento que pode variar.
·        Para controlar extensões de subclasses. Você pode definir um método template que chama operações “gancho”( que podem ser redefinidas) em pontos específicos, desta forma permitindo extensões somente nesses pontos.

Desvantagens/Consequências


Os metodos template são uma técnica fundamental para a reutilização de código. Eles são particularmente importantes em bibliotecas de classe porque são os meios para a fatoração dos comportamentos comuns nas bibliotecas de classes.
Os métodos template conduzem a uma estrutura de inversão de controle, algumas vezes chamada de “ o princípio de hollywood ”, ou seja: “não nos chamem nós chamaremos você”. Isto se refere a como uma classe-mãe chama as operações  de uma subclasse, e não o contrário. É importante para os métodos template especificarem quais operações são ganchos ( podem ser redefinidas) e quais operações são operações abstratas(devem ser redefinidas). Para reutilizar uma classe abstrata efetivamente, os codificadores de subclasses devem compreender quais as operações projetadas para redefinição. Uma subclasse pode estender o comportamento de uma operação de uma classe-mãe pela redefinição da operação e chamando a operação mãe explicitamente.

Estrutura

A representação do diagrama de classe no modelo da UML mostra como acontece físicamente a herança e quem fica responsável pela implementação. A importância de um diagrama de classes é porque descreve os tipos de objetos presentes no sistema e os vários tipos de relacionamentos estáticos existentes entre eles.

Exemplo
Uma abordagem diferente é ter o código fonte, cujo diagrama de classe está representado acima, seja fiel ao que está sendo representado no diagrama UML.

package br.com.nc.architect.templatemethod;

public abstract class AbstractClass {

    public final void templateMethod() {
        System.out.println("AbstractClass.templateMethod() called");
        primitiveOperation1();
        primitiveOperation2();

    }

    public abstract void primitiveOperation1();
    public abstract void primitiveOperation2();
}

package br.com.nc.architect.templatemethod;

public class Concrete1 extends AbstractClass {

    public void primitiveOperation1() {
        System.out.println("Concrete1.primitiveOperation1() called");
    }

    public void primitiveOperation2() {
        System.out.println("Concrete1.primitiveOperation2() called");
    }
}

package br.com.nc.architect.templatemethod;

public class Concrete2 extends AbstractClass {

    public void primitiveOperation1() {
        System.out.println("Concrete2.primitiveOperation1() called");
    }

    public void primitiveOperation2() {
        System.out.println("Concrete2.primitiveOperation2() called");
    }
}

package br.com.nc.architect.templatemethod;

public class TestTemplateMethod {

    public static void main(String[] args) {
        System.out.println("Test TemplateMethod");
        System.out.println("-------------------------");

        AbstractClass class1 = new Concrete1();
        AbstractClass class2 = new Concrete2();

        class1.templateMethod();
        class2.templateMethod();
    }
}

Exemplo de Uso

Os métodos template são tão fundamentais que eles podem ser encontrados em quase todas as classes abstratas.

 

Um comentário: