Template Method
O design pattern Template Method é utilizado quando se deseja definir o esqueleto de um algoritmo (ou seja, uma operação com vários passos) por meio de uma classe abstrata, deixando para as subclasses a responsabilidade de implementar as ações concretas realizadas por esse algoritmo.
Imagine um framework para construção de aplicações que manipulam documentos onde o processo de abertura de um documento segue uma seqüência de passos que não variam: verificar se o documento existe, adicioná-lo à lista de documentos abertos, notificar a aplicação que o documento será aberto, realizar a leitura do arquivo e adicionar os dados lidos ao objeto criado. E esse mesmo framework pode ser utilizado para vários tipos de documento, como planilhas, apresentações, documentos de texto, etc.
A idéia do Template Method é fatorar em uma classe abstrata o algoritmo necessário para, como no nosso exemplo, abrir o documento, deixando para as classes concretas a tarefa de implementar cada um dos passos envolvidos no processo.
A classe abstrata define as assinaturas dos métodos das operações primitivas (que serão implementadas pelas subclasses) e implementa (através de métodos concretos) o(s) processo(s) definido para execução do algoritmo (no nosso exemplo, o processo de abertura de um arquivo).
Veja um exemplo em Java da implementação da classe Application que faz o papel da classe abstrata do nosso exemplo no padrão Template Method:
abstract class Application
{
(...)
public Document openDocument(String name) {
if (documentExists(name)) {
Document doc = new Document(name);
documents.add(doc);
aboutToOpenDocument(doc);
doc.open();
doc.doRead();
return doc;
}
}
abstract void aboutToOpenDocument(Document doc);
(...)
}
As classes concretas que extendem Application (SpreadSheetApplication, PresentationApplication, etc) devem se preocupar em implementar o método aboutToOpenDocument, sem precisar se preocupar com os passos executados no processo de abertura de um documento, que encontra-se implementado em Application.
O design pattern Factory Method induz ao reuso de código, permitindo, como já foi notado antes, fatorar código comum a várias situações. Além disso o Factory Method oferece uma inversão nas implementações tradicionais, onde classes filhas invocam métodos de classes pai: no Template Method a classe pai é responsável por invocar métodos de suas subclasses.