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 – 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