O documento descreve o padrão de projeto Composite, que permite a criação de objetos hierárquicos através da composição de objetos semelhantes. O padrão é ilustrado com um exemplo de formas geométricas, onde formas compostas são constituídas de outras formas implementando uma interface comum.
2. Introdução
Composite(Objeto Composto) é um padrão de projeto que
permite que um objeto seja constituído de outros objetos
semelhantes a ele formando uma hierarquia.
Utilizando o padrão Composite é simples criar uma hierarquia
de objetos semelhantes. Semelhantes, significa aqui, objetos
que implementam uma interface comum. O padrão simplifica
o tratamento de cada elemento da hierarquia ao tratar a
todos como implementações da mesma interface.
3. Descrição do Problema
Você quer construir um objeto que seja construído
de outros objetos tal que, um ou mais objetos desses
podem ser do mesmo tipo do objeto construído.
O objeto é construído por objetos que contém uma
coleção de outros objetos.
Contudo esses objetos não são quaisquer, eles
compartilham uma interface comum.
4. Exemplo
Por exemplo, um objeto do tipo Forma. Existem várias formas,
mas todas elas podem ser construídas pela composição de
outras formas. Um ou mais formas são primitivas, ou seja, não
são construídas a partir de nenhuma forma, outras serão.
O exemplo mais simples é a forma Linha que representa uma
semirreta. Um Triangulo é composto por três Linha. Um
quadrado por quatro ,e etc… Um circulo não é representável
por um conjunto finito de linhas, logo precisamos de uma
forma primitiva Circulo.
Como construir os objetos do tipo Forma para que eles
obedeçam a esta hierarquia é o que o
padrão Composite resolve.
5. Descrição da Solução
Construa uma interface ou classe abstrata que
representa o tipo de objeto na hierarquia.
8. componente Participante
public abstract class Participante {
public String getNome() {
throw new UnsupportedOperationException();
}
public int getAssento() {
throw new UnsupportedOperationException();
}
public void adicionar(Participante participante) {
throw new UnsupportedOperationException();
}
public void remover(Participante participante) {
throw new UnsupportedOperationException();
}
public Participante getFilho(int index) {
throw new UnsupportedOperationException();
}
}
9. primitivo Individuo
public class Individuo extends Participante {
private String nome;
private int assento;
public Individuo(String nome, int assento) {
this.nome = nome;
this.assento = assento;
}
@Override
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
10. primitivo Individuo
@Override
public int getAssento() {
return assento;
}
public void setAssento(int assento) {
this.assento = assento;
}
@Override
public String toString() {
return "Nome: " + this.nome + " - Assento: " + this.assento;
}
}
11. composto Instituição
import java.util.ArrayList;
import java.util.List;
public class Instituicao extends Participante {
private String nome;
private List<Participante> membros;
public Instituicao(String nome) {
this.nome = nome;
membros = new ArrayList<Participante>();
}
@Override
public void adicionar(Participante participante) {
membros.add(participante);
}
@Override
public void remover(Participante participante) {
membros.remove(participante);
}
12. composto Instituição
@Override
public Participante getFilho(int index) {
return membros.get(index);
}
@Override
public String getNome() {
return nome;
}
public List<Participante> getMembros() {
return membros;
}
@Override
public String toString() {
return "Instituição: " + this.nome;
}
public void imprimeMembros() {
for (Participante membro : membros) {
System.out.println(membro + " - Instituição: " + this.nome);
}
}
}