Padrões de Projeto de Software Template Method Paulo Gomide Departamento de Ciência da Computação Universidade de Itaúna
Sumary Template Method Definição, Motivação e Aplicabilidade Estrutura, Elementos do Padrão e Colaborações Consequências Código de Exemplo Padrões Relacionados
Template Method Definição Define o esqueleto do algoritmo através de uma operação (abstrata), deixando que subclasses refinem o restante do algoritmo (comportamento concreto); Permitem que subclasses redefinam certos aspectos de um algoritmo sem modificar a estrutura do algoritmo.
Motivação Problema Específico Considere um framework para jogos de tabuleiro (Game Center, Game Store, etc.); O ideal é que exista uma estrutura comum entre os jogos a fim de agilizar o desenvolvimento de novos jogos; A classe base Jogo pode apresentar operações comuns a todos os jogos: inicializarjogo(), fazerjogada(), fimjogo() e imprimirganhador().
Motivação Solução Template Method: a classe base define métodos abstratos que são comuns aos vários jogos a serem implementados, deixando as subclasses definir as particularidades de cada um; Um exemplo de Template Method neste caso pode ser jogarpartida(); 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.
Aplicabilidade Requisitos para se Aplicar o Padrão O uso do padrão Template Method é indicado quando: A estrutura fixa de um algoritmo puder ser definida pela superclasse (implementar uma só vez) deixando as subclasses preencher as partes que podem variar (frameworks); Deseja-se implementar as partes invariantes de um algoritmo uma só vez e deixar para as subclasses a implementação do comportamento que pode variar; Classes contem código replicado, e deseja-se fundir o código repetido e deixar as subclasses implementarem as variações; Há a necessidade de controlar extensões de subclasses.
Estrutura do Problema Geral
Participantes do Padrão AbstractClass Definem 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 outros métodos abstratos que são implementados nas subclasses concretas.
Participantes do Padrão ConcreteClass Implementa os métodos abstratos necessários para a execução do método template; Redefine métodos da AbstractClass.
Colaborações ConcreteClass faz uma chamada à AbstractClass, que contem o esqueleto do algoritmo, após isso o templatemethod() faz as devidas chamadas à ConcreteClass.
Conseqüências Vantagens 1. Facilita a reutilização de código com a definição da parte invariante; 2. Inversão de Controle (IoC): Superclasse Subclasse. Desvantagens 1. Os desenvolvedores são obrigados a saber quais classes devem e quais podem ser redefinidas.
Código de Exemplo Código de Exemplo O código exemplo a seguir mostra como a superclasse pode forçar uma invariância às subclasses; Temos uma classe View para vizualizar uma imagem na tela. Ela força que suas subclasses desenhem sobre uma figura só quando ela se tona o foco ; Com isso a imagem pode requerer algum estado de desenho específico (cores e fontes) para ser configurado corretamente.
Código de Exemplo Podemos usar métodos templates para criar esse estado: DoDisplay; View define duas operações concretas, SetFocus e ResetFocus, que configura e limpa o estado de desenho, respectivamente; A operação gancho DoDisplay realiza o desenho real; Display chama SetFocus antes DoDisplay para configurar o estado de desenho e ResetFocus depois de liberar o estado do desenho.
Código de Exemplo Para manter a invariante, os clientes do View sempre fazem requisições a Display, e as subclasses de View sempre sobrecarregam DoDisplay. DoDisplay não faz nada em View. E suas subclasses fazem a sobrecarga para adicionar o seu comportamento de desenho específico.
Padrões Relacionados Factory Method São freqüentemente usados por Template Methods, mas esses não tem responsabilidade de definir parte variantes e invariantes; No problema de motivação, o Template Method JogarPartida pode chamar um Factory Method DoJogarPartida, por exemplo.
Padrões Relacionados Strategy Template Method usam herança para variar partes de um algoritmo; Strategy usam delegação para variar ou definir possibilidade de um algoritmo inteiro.
Obrigado pela atenção! Dúvidas?