O padrão de método de modelo do padrão de design Java define a estrutura de um algoritmo operacional e adia algumas etapas para subclasses, para que as subclasses possam redefinir certas etapas específicas no algoritmo sem alterar a estrutura do algoritmo. Modelo comportamental
Conforme mostrado abaixo:
Na verdade, o método template é um padrão frequentemente usado em programação. Vejamos primeiro um exemplo. Um dia, o programador A recebeu uma tarefa: dada uma matriz de números inteiros, classifique os números na matriz de pequenos para grandes e, em seguida, imprima os resultados classificados. Após análise, esta tarefa pode ser dividida em duas partes: classificação e impressão. A função de impressão é fácil de implementar, mas a classificação é um pouco problemática. Mas A tem uma maneira de completar primeiro a função de impressão e encontrar outra pessoa para fazer a função de classificação.
abstract class AbstractSort { /** * Classifica o array array de pequeno a grande * @param array */ protected abstract void sort(int[] array); System.out.print("Classificar resultado: "); for (int i = 0; i < array.length; i++){ System.out.printf("%3s", array[i]);
Depois de terminar de escrever, A encontrou seu colega B que havia acabado de se formar e ingressou no trabalho recentemente e disse: Já escrevi a lógica principal. Então dei a classe AbstractSort para B e pedi a B para escrever a implementação. B assumiu e deu uma olhada. Era muito simples. Poderia ser feito em 10 minutos.
class ConcreteSort estende AbstractSort { @Override protected void sort(int[] array){ for(int i=0; i<array.length-1; i++){ selectSort(array, i } } private void selectSort(int[); ] array, int index) { int MinValue = 32767; // Variável de valor mínimo int indexMin = 0; // Variável de índice de valor mínimo int Temp; index; i < array.length; i++) { if (array[i] < MinValue){ // Encontre o valor mínimo MinValue = array[i]; index] ; // Troca dois valores array[index] = array[indexMin];
Depois de escrevê-lo, entregue-o a A, e A irá executá-lo:
public class Cliente { public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // Matriz de dados padrão public static void main(String[] args){ AbstractSort s = new ConcreteSort(); s.showSortResult(a);
Resultados em execução:
Classificando resultados: 0 1 3 4 5 7 9 10 12 32
Funciona bem. Ok, missão cumprida. Sim, este é o padrão do método template. A maioria dos graduados que acabaram de ingressar no mercado de trabalho deve ter uma experiência semelhante à B. Para uma tarefa complexa, as melhores pessoas da empresa escreverão a lógica principal e, em seguida, transformarão os métodos aparentemente simples em métodos abstratos e os deixarão para outros colegas desenvolverem. Esta divisão de trabalho é frequentemente utilizada em empresas com níveis óbvios de pessoal de programação. Por exemplo, se uma equipe de projeto tiver um arquiteto, um engenheiro sênior e um engenheiro júnior, o arquiteto geralmente usará um grande número de interfaces e classes abstratas para encadear a lógica de todo o sistema, e a codificação da implementação será entregue ao o engenheiro sênior e o engenheiro júnior, respectivamente, de acordo com a dificuldade. Que tal, você já usou o padrão de método template?
A estrutura do padrão do método template:
O padrão de método modelo consiste em uma classe abstrata e uma (ou um grupo de) classes de implementação por meio de uma estrutura de herança. Os métodos na classe abstrata são divididos em três tipos:
1. Método abstrato : é declarado apenas na classe pai, mas não implementado. Em vez disso, a especificação é definida e então implementada por suas subclasses.
2. Método template : declarado e implementado por uma classe abstrata. De modo geral, os métodos de modelo chamam métodos abstratos para completar as funções lógicas principais, e a maioria dos métodos de modelo são definidos como tipos finais, indicando que as funções lógicas principais não podem ser substituídas em subclasses.
3. Método Hook : declarado e implementado pela classe abstrata. Mas as subclasses podem ser estendidas e as subclasses podem afetar a lógica dos métodos de modelo estendendo os métodos de gancho.
A tarefa das classes abstratas é construir uma estrutura lógica, que geralmente é escrita por pessoal experiente, porque a qualidade das classes abstratas determina diretamente a estabilidade do programa.
Classes de implementação são usadas para implementar detalhes. O método modelo na classe abstrata completa a lógica de negócios implementando o método de extensão de classe. Contanto que o método de extensão na classe de implementação passe no teste de unidade e o método de modelo esteja correto, geralmente não haverá erros graves na função geral.
Vantagens e cenários aplicáveis do método template:
Fácil de expandir. De modo geral, o método template em uma classe abstrata é a parte que não é fácil de alterar retroativamente, enquanto o método abstrato é a parte que é fácil de alterar retroativamente. Portanto, ao adicionar classes de implementação, geralmente é fácil expandir a função. , o que está de acordo com o princípio de abertura e fechamento.
Fácil de manter. Para o padrão do método template, é precisamente porque sua lógica principal é a mesma que o método template é usado. Se o método template não for usado, o mesmo código pode ser espalhado em classes diferentes, o que é muito inconveniente de manter. .
Mais flexível. Por causa do método hook, a implementação da subclasse também pode afetar a operação da lógica principal na classe pai. Porém, embora seja flexível, pois a subclasse afeta a classe pai, viola o princípio de substituição de Liskov e também traz riscos ao programa. Isso impõe requisitos mais elevados ao design de classes abstratas.
Quando várias subclasses têm o mesmo método e a lógica desses métodos é a mesma, você pode considerar o uso do padrão de método modelo. Este modo também é mais adequado para situações onde a estrutura principal do programa é a mesma, mas os detalhes são diferentes.