Questão de Engenharia de Software — UML — FGV 2024
Engenharia de Software›UML
Código
fg077375
Banca
FGV
Órgão
CVM
Ano
2024
Nível
Superior
Cargo
Analista - Perfil 8 - TI / Sistemas e Desenvolvimento - Tarde
Os padrões de projeto são extremamente úteis para organizar a arquitetura do sistema e o modelo de programação. Eles são projetados em diagramas da UML, como no modelo a seguir.O diagrama expressa o padrão de projeto:
AObserver;
BSingleton;
CData Access Object;
DIntercept Filter;
ETemplate Method.
Revelar gabarito e comentário▾
GabaritoE — Template Method.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Padrões de Projeto: Template Method
Gabarito: letra E. O diagrama apresentado expressa o padrão Template Method, pois mostra uma classe abstrata (ou base) que define o esqueleto de um algoritmo, delegando a implementação de alguns passos a subclasses, que podem sobrescrevê-los sem alterar a estrutura geral. Esse é o conceito central do padrão, conforme descrito no livro Design Patterns (GoF).
O Template Method é um padrão de projeto comportamental que define a estrutura de um algoritmo em uma operação, postergando alguns passos para as subclasses. Em outras palavras, a classe base contém o "template" (molde) do algoritmo, com os passos fixos e os passos variáveis (métodos abstratos ou métodos com implementação padrão que podem ser sobrescritos). As subclasses redefinem esses passos específicos, mas não podem alterar a ordem ou a estrutura geral do algoritmo.
No diagrama UML típico desse padrão, temos uma classe abstrata (por exemplo, ClasseBase) com um método TemplateMethod() que chama outros métodos, alguns abstratos (como Operacao1() e Operacao2()) e outros concretos. As subclasses (ClasseConcretaA, ClasseConcretaB) herdam da classe base e implementam os métodos abstratos. O diagrama mostra a relação de herança (generalização) entre a classe base e as subclasses, e é isso que o identifica.
A principal característica que distingue o Template Method de outros padrões é a inversão de controle: a classe base controla o fluxo do algoritmo, e as subclasses fornecem os detalhes. Isso é diferente, por exemplo, do padrão Strategy, onde o algoritmo é encapsulado em classes separadas e pode ser trocado em tempo de execução, sem que a classe cliente conheça a implementação.
Na prática, o Template Method é usado quando temos um algoritmo com passos comuns e passos específicos, e queremos evitar duplicação de código. Por exemplo, em um sistema de processamento de pagamentos, a classe base define o fluxo: validar dados, calcular taxas, debitar, creditar, notificar. As subclasses para cartão de crédito, boleto e Pix implementam os passos específicos (como calcular taxas diferentes), mas o fluxo geral é o mesmo.
A banca explora a confusão entre Template Method e outros padrões, especialmente Observer e Singleton, que têm estruturas de diagrama bem diferentes. O Observer envolve uma relação de dependência um-para-muitos entre objetos, com notificações de mudança de estado. O Singleton garante uma única instância de uma classe, representado por um diagrama de classes com um atributo estático e um método de acesso global. O Template Method, por sua vez, é identificado pela presença de uma classe abstrata com um método que define o algoritmo e subclasses que o estendem.
Guarde a essência: Template Method = esqueleto de algoritmo + subclasses que preenchem os passos. É essa estrutura que você deve procurar no diagrama para acertar a questão.
Critério
Template Method (gabarito)
Observer
Singleton
DAO
Intercept Filter
Categoria
Comportamental (GoF)
Comportamental (GoF)
Criacional (GoF)
Arquitetural (Core J2EE)
Arquitetural (Core J2EE)
Estrutura no diagrama
Classe abstrata com método que define o algoritmo + subclasses que implementam passos
Sujeito com lista de observadores + métodos anexar/notificar
Classe com atributo estático privado + método estático público getInstance()
Interface DAO + classes concretas de persistência
Cadeia de filtros + alvo (target)
Relação principal
Herança (generalização)
Associação/dependência um-para-muitos
Auto-referência (instância única)
Implementação de interface
Composição/encadeamento
Objetivo central
Definir esqueleto de algoritmo com passos variáveis
Notificar dependentes sobre mudanças de estado
Garantir instância única global
Separar acesso a dados da lógica de negócio
Processar requisições/respostas com filtros
Inversão de controle
Sim — classe base controla o fluxo
Não — sujeito notifica observadores
Não — controle da instância
Não — abstração de persistência
Não — fluxo de filtros
Presença de subclasses que sobrescrevem métodos
Sim (essencial)
Não (observadores implementam interface)
Não
Não (implementam interface, sem esqueleto)
Não (filtros são independentes)
Alternativa A — ❌ Incorreta
O padrão Observer define uma dependência um-para-muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados automaticamente. O diagrama típico do Observer mostra um sujeito (Subject) com uma lista de observadores (Observers) e métodos para anexar, desanexar e notificar. Não há relação de herança com subclasses implementando passos de um algoritmo, como no diagrama da questão.
Alternativa B — ❌ Incorreta
O padrão Singleton garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela. O diagrama de classes do Singleton mostra uma classe com um atributo estático privado (a instância única) e um método estático público (como getInstance()). Não há herança nem subclasses, e o diagrama da questão não apresenta essa estrutura.
Alternativa C — ❌ Incorreta
O padrão Data Access Object (DAO) é um padrão de arquitetura que separa a lógica de acesso a dados da lógica de negócio, fornecendo uma interface para operações de persistência (como CRUD). O diagrama típico do DAO mostra uma interface DAO e classes concretas que a implementam, mas não há um método que define o esqueleto de um algoritmo com passos a serem sobrescritos. O foco é a abstração do acesso a dados, não a estrutura de um algoritmo.
Alternativa D — ❌ Incorreta
O padrão Intercept Filter é um padrão de arquitetura usado em aplicações web para processar requisições e respostas de forma centralizada, permitindo que filtros (como autenticação, logging, compressão) sejam aplicados antes e depois do processamento principal. O diagrama típico mostra uma cadeia de filtros (Filter Chain) e um alvo (Target), mas não envolve herança com subclasses implementando passos de um algoritmo. É um padrão de filtragem, não de definição de algoritmo.
Alternativa E — ✅ Correta ⟵ GABARITO
O padrão Template Method é exatamente o que o diagrama representa: uma classe abstrata define o esqueleto de um algoritmo (o método TemplateMethod()), e as subclasses implementam os passos específicos (métodos abstratos ou métodos com implementação padrão que podem ser sobrescritos). A relação de herança entre a classe base e as subclasses, com a indicação de que os métodos são sobrescritos, é a assinatura visual desse padrão. É um padrão comportamental que promove a reutilização de código e a inversão de controle.