No entanto, desde que você confie que o Princípio da Substituição de Liskov será seguido, por que você não permitiria que ele fosse vencido?
Por exemplo, porque eu quero que a implementação esquelética de um algoritmo seja corrigida e permita apenas que partes específicas sejam (re) definidas por subclasses. Isso é amplamente conhecido como padrão do método de modelo (ênfase abaixo por mim):
O método de modelo, portanto, gerencia a imagem maior da semântica de tarefas e detalhes de implementação mais refinados da seleção e sequência dos métodos. Essa imagem maior chama métodos abstratos e não abstratos para a tarefa em questão. Os métodos não abstratos são completamente controlados pelo método de modelo, mas os métodos abstratos, implementados nas subclasses, fornecem o poder expressivo e o grau de liberdade do padrão. Alguns ou todos os métodos abstratos podem ser especializados em uma subclasse, permitindo que o gravador da subclasse forneça um comportamento específico com modificações mínimas na semântica maior. O método do modelo (que não é abstrato) permanece inalterado nesse padrão, garantindo que os métodos não abstratos subordinados e os métodos abstratos sejam chamados na sequência pretendida originalmente.
Atualizar
Alguns exemplos concretos de projetos nos quais tenho trabalhado:
- comunicação com um sistema legado de mainframe através de várias "telas". Cada tela possui vários campos, de nome fixo, posição e comprimento, contendo bits de dados específicos. Uma solicitação preenche determinados campos com dados específicos. Uma resposta retorna dados em um ou mais outros campos. Cada transação segue a mesma lógica básica, mas os detalhes são diferentes em todas as telas. Utilizamos o Template Method em vários projetos diferentes para implementar o esqueleto fixo da lógica de manipulação de tela, enquanto permitimos às subclasses definir os detalhes específicos da tela.
- exportando / importando dados de configuração em tabelas de banco de dados para / de arquivos do Excel. Novamente, o esquema básico de processar um arquivo do Excel e inserir / atualizar registros do banco de dados ou despejar os registros no Excel é o mesmo para cada tabela, mas os detalhes de cada tabela são diferentes. Portanto, o Template Method é uma escolha muito óbvia para eliminar duplicatas de código e facilitar a compreensão e manutenção do código.
- Gerando documentos PDF. Cada documento tem a mesma estrutura, mas seu conteúdo é diferente a cada vez, dependendo de muitos fatores. Mais uma vez, o Template Method facilita a separação do esqueleto fixo do algoritmo de geração dos detalhes mutáveis e específicos do caso. De fato. ele ainda se aplica a vários níveis aqui, pois o documento consiste em várias seções , cada uma das quais consiste em zero ou mais campos . O Método do Modelo é aplicado em 3 níveis distintos aqui.
Nos dois primeiros casos, a implementação legada original usou a Strategy , resultando em muitos códigos duplicados, que, com o passar dos anos, cresceram sutis diferenças aqui e ali, continham muitos bugs duplicados ou ligeiramente diferentes e eram muito difíceis de manter. A refatoração para o Método do modelo (e alguns outros aprimoramentos, como o uso de anotações em Java) reduziu o tamanho do código em cerca de 40 a 70%.
Estes são apenas os exemplos mais recentes que me vêm à mente. Eu poderia citar mais casos de quase todos os projetos em que tenho trabalhado até agora.