Pular para o conteúdo principal

Questão de Engenharia de Software — Padrões de Projeto (Engenharia de Software) — CESPE / CEBRASPE 2025

Engenharia de SoftwarePadrões de Projeto (Engenharia de Software)
Código
ce417758
Banca
CESPE / CEBRASPE
Órgão
TRF 6
Ano
2025
Cargo
AJ TRF6

Julgue o item a seguir relativo à arquitetura de microsserviços, ao domain-driven design e a design patterns.

 

O padrão decorator permite que classes concretas sejam envolvidas em uma hierarquia de objetos que compartilham a mesma interface, em que cada decorador implementa a interface base e delega chamadas para o objeto decorado, adicionando funcionalidade antes ou depois da delegação.

  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

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ão Decorator: composição transparente de responsabilidades

Gabarito: Certo (C). A afirmativa descreve com precisão o padrão estrutural Decorator (GoF): um decorador implementa a mesma interface do componente que envolve e delega a ele as chamadas, acrescentando comportamento antes ou depois da delegação — exatamente o que o enunciado afirma. A fonte é o catálogo clássico de padrões de projeto (Gamma et al., 1995), que classifica o Decorator como padrão estrutural.

O padrão Decorator resolve um problema recorrente em projetos orientados a objetos: como adicionar responsabilidades a um objeto de forma dinâmica e transparente, sem recorrer à herança para cada combinação possível de funcionalidades. A herança é estática (decidida em tempo de compilação) e pode gerar uma explosão de subclasses — pense em um café com combinações de leite, chocolate, chantilly e canela: com herança pura, seriam necessárias dezenas de classes. O Decorator ataca exatamente esse problema.

A estrutura do padrão é composta por quatro elementos: (1) a interface base (Component), que define as operações comuns; (2) o componente concreto (ConcreteComponent), que implementa a interface e fornece o comportamento original; (3) a classe decoradora abstrata (Decorator), que também implementa a interface e mantém uma referência a um Component; e (4) os decoradores concretos (ConcreteDecorator), que estendem a classe decoradora e adicionam responsabilidades. O ponto-chave é que o decorador envolve o componente e delega a ele as chamadas, podendo executar lógica adicional antes ou depois dessa delegação.

Na prática, o funcionamento é uma cadeia de invocações. Suponha uma interface Bebida com o método custo(). A classe Cafe implementa Bebida e retorna R$ 5,00. O decorador Leite recebe uma Bebida no construtor, implementa custo() chamando bebida.custo() + 1.50. O decorador Chantilly faz o mesmo, adicionando R$ 2,00. Ao criar new Chantilly(new Leite(new Cafe())), a chamada a custo() percorre a cadeia: Chantilly delega para Leite, que delega para Cafe, e cada um soma sua parcela no retorno — R$ 8,50 no total. É exatamente o que o enunciado descreve: "cada decorador implementa a interface base e delega chamadas para o objeto decorado, adicionando funcionalidade antes ou depois da delegação".

A distinção que mais confunde em prova é entre Decorator e Composite. Ambos são padrões estruturais que trabalham com uma interface comum e delegação, mas com propósitos opostos: o Composite compõe objetos em estruturas de árvore para que clientes tratem objetos individuais e composições de forma uniforme (o todo e a parte têm o mesmo tratamento); o Decorator adiciona responsabilidades a um único objeto, envolvendo-o em uma camada que estende seu comportamento. Outra confusão comum é com o Adapter, que converte a interface de uma classe em outra interface esperada pelo cliente — o Adapter muda a interface; o Decorator preserva a interface e apenas acrescenta comportamento.

A pegadinha que a banca explora neste tema é inverter os papéis: afirmar que o decorador substitui o objeto decorado, ou que ele altera a interface base. Nada disso — o decorador mantém a mesma interface e delega ao objeto original, apenas embrulhando-o com funcionalidade extra. O enunciado desta questão está tecnicamente impecável e não contém armadilha: é uma descrição fiel do padrão.

Guarde a essência: Decorator = mesma interface + delegação + funcionalidade extra antes/depois. É esse tripé que a afirmativa espelha e que separa o Decorator dos demais padrões estruturais.

Decorator (GoF — estrutural)
  • 1Objetivo
    • Adicionar responsabilidades dinamicamente
    • Evitar explosão de subclasses (herança)
  • 2Estrutura
    • Component (interface base)
    • ConcreteComponent (comportamento original)
    • Decorator
      • implementa a interface + referência ao Component
    • ConcreteDecorator (adiciona funcionalidade)
  • 3Mecânica
    • Mesma interface
    • Delega ao objeto decorado
    • Funcionalidade antes/depois da delegação
  • 4Confusões comuns
    • Composite (compõe árvore todo/parte)
    • Adapter (converte a interface)
LEVEL · soulevel.com.br

Item — ✅ CERTO

A afirmativa está correta porque descreve com fidelidade a mecânica do padrão Decorator. Vejamos cada trecho:

  • "classes concretas sejam envolvidas em uma hierarquia de objetos que compartilham a mesma interface" — correto: o decorador e o componente concreto implementam a mesma interface (Component), permitindo que o decorador seja usado no lugar do componente original de forma transparente.

  • "cada decorador implementa a interface base" — correto: a classe decoradora (abstrata ou concreta) implementa a interface do componente.

  • "delega chamadas para o objeto decorado" — correto: o decorador mantém uma referência ao componente que envolve e repassa a ele as chamadas.

  • "adicionando funcionalidade antes ou depois da delegação" — correto: é exatamente essa a essência do padrão — o decorador executa lógica adicional antes de chamar o método do componente, depois, ou ambos.

Não há nenhum termo trocado ou conceito invertido. A descrição corresponde à definição canônica do padrão Decorator do catálogo GoF (Gamma, Helm, Johnson e Vlissides, 1995), classificado como padrão estrutural. O enunciado não afirma que o decorador substitui o objeto, nem que altera a interface — apenas que o envolve e delega, o que é a definição precisa do padrão.

Gabarito: Certo (C).

Link permanente: /questoes/ce417758