🖥️
Padrões de Projeto
  • Padrões de Projeto
  • Orientação a Objetos
    • Conceitos básicos de orientação a objetos
      • Objetos e classes
      • Encapsulamento
      • Relacionamentos
      • Herança
      • Realização
      • Polimorfismo
      • Imutabilidade
  • Princípios SOLID
    • Introdução
    • SRP - Princípio de Responsabilidade Única
    • OCP - Princípio de Aberto/Fechado
    • LSP - Princípio de Substituição de Liskov
    • ISP - Princípio de Segregação de Interfaces
    • DIP - Princípio de Inversão de Dependência
  • Padrões de Projetos e catálogos
    • Introdução
  • Padrões Comportamentais
    • Padrão Strategy
    • Padrão State
    • Padrão Observer
    • Padrão Chain of Responsibility
    • Padrão Command
    • Padrão Template Method
    • Padrão Null Object
  • Padrões Criacionais
    • Padrão Singleton
    • Padrão Prototype
    • Padrão Builder
    • Padrões Factory
      • Factory Method
      • Abstract Factory
  • Padrões Estruturais
  • Padrão Adapter
  • Padrão Facade
  • Padrão Decorator
  • Padrão Proxy
  • Padrão Bridge
  • Padrão Composite
Powered by GitBook
On this page
  • Problema
  • Composição recursiva
  • Solução
  • Self Composite e Composite na API nativa do Java

Was this helpful?

Padrão Composite

PreviousPadrão Bridge

Last updated 4 years ago

Was this helpful?

O Composite é um padrão de projeto estrutural que permite compor objetos em uma estrutura semelhante a uma árvore e trabalhar com eles como se fosse um objeto singular.

Problema

Em certas estruturas, necessitamos de métodos e funções que já estão especializadas em um determinado objeto, necessitando apenas a ligação entre os dois para reutilizar o código. No nosso problema vamos trabalhar com um Editor de texto (como o Microsoft Word, por exemplo) que pode misturar texto e gráficos usando várias opções de formatação (negrito, itálico, alinhamento centralizado, etc.)

O primeiro problema de design que queremos atacar é como representar a estrutura do documento. Essa estrutura afeta o resto da aplicação já que a edição, formatação, análise textual, etc. deverão acessar a representação do documento.

Vamos encarar um documento como um arranjo de elementos gráficos básicos: caracteres, linhas, polígonos e outras figuras. O usuário normalmente não pensa em termos desses elementos gráficos mas em termos de estruturas físicas, tais como linhas, colunas, figuras, tabelas e outras subestruturas. Essas subestruturas, por sua vez, podem ser compostas de outras subestruturas, etc.

Composição recursiva

Uma forma comum de representar informação estruturada hierarquicamente é através da Composição Recursiva. Ela permite construir elementos complexos a partir de elementos simples – aqui, a composição recursiva vai permitir compor um documento a partir de elementos gráficos simples.

Começamos formando linhas a partir de elementos gráficos simples (caracteres e gráficos), múltiplas linhas formam colunas, múltiplas colunas formam páginas, múltiplas páginas formam documentos, etc.

O Padrão Composite se baseia nessa idéia para compor objetos em uma estrutura semelhante a uma árvore. Imagine os elementos do exemplo acima dispostos da seguinte maneira:

Solução

Composite é um padrão de projeto que permite que um objeto seja constituído de outros objetos semelhantes a ele formando uma hierarquia parte-todo. Semelhantes, aqui, significam objetos que implementam um contrato comum.

Em resumo, vamos tratar composições e unidades uniformemente. Faremos isso por meio da interface TipoDaHierarquia no exemplo abaixo. Os elementos que podem ser compostos, como linhas e colunas, são subtipos de Composto, a medida que os elementos que não podem ser compostos (como imagens e caracteres) são subtipos de Primitivo.

A ideia desse padrão é montar uma árvore onde tanto as folhas (primitivos ou objetos individuais) quanto os compostos (grupos de objetos) sejam tratados de maneira igual. Em termos de orientação a objetos, isso significa aplicarmos polimorfismo para chamar métodos de um objeto na árvore sem nos preocuparmos se ele é uma folha ou um composto.

Self Composite e Composite na API nativa do Java

Em algumas situações especiais não existe um objeto primitivo na hierarquia ou a sua interface não se distingue da interface do objeto composto. Neste caso o objeto que representa o tipo de hierarquia é simultaneamente o objeto composto e o objeto primitivo.

Em Java, o objeto File implementa o padrão self-composite. O objeto representa simultaneamente um arquivo e uma pasta de arquivos num sistema de arquivos (que tem uma estrutura em árvore).

Exemplo de representação do documento