Projeto de Sistemas de Software Sérgio Luiz Ruivace Cerqueira Template Method Projeto de Sistemas de Software Sérgio Luiz Ruivace Cerqueira
Propósito Esse padrão define que sejam implementadas certas partes de um algoritmo na classe abstrata e as que não foram implementadas devem ser nas classes filhas concretas. Assim, é possível aplicar determinados comportamentos no algoritmo e reusar o mesmo algoritmo, de acordo com as classes filhas. © LES/PUC-Rio
Motivação Considere um framework para jogos de tabuleiro. A classe Jogo têm os métodos abstratos: inicializarJogo(), fazerJogada(Jogador), fimJogo() e imprimirGanhador() O método template é jogarPartida(Jogadores). Esse método inicializa a partida e enquanto o jogo não termina um jogador faz uma jogada. No final o vencedor é impresso. Dessa forma é possível criar diversos jogos diferentes reutilizando o algoritmo de jogar uma partida. © LES/PUC-Rio
Aplicabilidade Útil para a implementação de frameworks e aplicações flexíveis. Pode ser utilizado para implementar as partes invariantes de um algoritmo uma só vez e deixar para as subclasses a implementação do comportamento que pode variar Quando classes contem código replicado, esse padrão pode ser usado para fundir o código repetido e deixar as subclasses implementarem as variações. Além de poder ser usado para controlar extensões de subclasses. © LES/PUC-Rio
Estrutura © LES/PUC-Rio
Participantes AbstractClass ConcreteClass Define métodos abstratos que as subclasses concretas implementam. Implementa um método concreto template que contem o esqueleto de um algoritmo. Além disso o método template invoca os métodos necessários para a execução do algoritmo inclusive os métodos abstratos, que são implementados nas subclasses concretas. ConcreteClass Implementa os métodos abstratos necessários para a execução do método template. Redefine métodos da AbstractClass. © LES/PUC-Rio
Colaborações ConcreteClass faz uma chamada à AbstractClass, que contem o esqueleto do algoritmo, após isso o templateMethod() faz as devidas chamadas à ConcreteClass. © LES/PUC-Rio
Conseqüências Facilita a reutilização de código Inversão de Controle (IoC) Os desenvolvedores são obrigados a saber quais classes devem e quais podem ser redefinidas. © LES/PUC-Rio
Código de Exemplo © LES/PUC-Rio
Código de Exemplo © LES/PUC-Rio
Referencias Gamma et al., Padrões de Projeto - soluções reutilizáveis de software orientado a objetos, Porto Alegre : Bookman , 2000. Wikpedia, Template method pattern, acessado em 5 de abril de 2009. © LES/PUC-Rio