3. Composite
A ideia desse padrão é montar uma árvore onde tanto as folhas (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
3
4. Composite - Aplicabilidade 4
Quando quiser representar hierarquia de objetos
Quando quiser que seus clientes sejam capazes de diferenciar suas
composições de seus objetos individuais
5. Composite - Estrutura 5
Cliente
Componente
Folha Composite
Manipula os objetos através da
interface Componente
Declara a interface para os objetos
comuns de sua composição.
Representa um objeto folha em uma
estrutura de árvore..
Representa um nó em uma estrutura de
árvore.
6. Composite – Estrutura de Árvore 6
A
Q1 Q2 Q3
AB
B
B1 B2
Q4 Q5 Q6 Q7
As operações
podem
ser aplicadas ao
todo.
Ou às partes
Print()
8. Composite – Consequências
Define hierarquias de classes que consistem de objetos simples
e objetos compostos
sempre que um cliente esperar um objeto simples, pode
receber um composto
Simplifica os clientes
os clientes não sabem se estão lidando com objetos simples
ou compostos.
Facilita a adição de novos tipos de componentes
Pode tornar o projeto geral demais
é difícil restringir os componentes de um composite.
8
9. 9Composite – Implementação
// classe base (o componente)
public abstract class ElementoDoQuestionario
{
protected string Descricao;
protected ElementoDoQuestionario(string descricao)
{
Descricao = descricao;
}
public abstract void Exibir();
}
// bloco (o composto)
public class Bloco : ElementoDoQuestionario
{
private IList<ElementoDoQuestionario> _elementos = new
List<ElementoDoQuestionario>();
public IEnumerable<ElementoDoQuestionario> Elementos
{ get { return _elementos; } }
public Bloco(string descricao) : base(descricao) { }
public override void Exibir()
{
Console.WriteLine("Bloco: {0}", Descricao);
foreach (var elemento in _elementos)
elemento.Exibir();
}
public void Adicionar(ElementoDoQuestionario elemento)
{
_elementos.Add(elemento);
}
public void Remover(ElementoDoQuestionario elemento)
{
_elementos.Remove(elemento);
}
}
// questão (a folha)
public class Questao : ElementoDoQuestionario
{
public Questao(string descricao) : base(descricao) { }
public override void Exibir()
{
Console.WriteLine("Questão: {0}", Descricao);
}
}
}
10. "Considerando o triste estado dos programas de computador, o desenvolvimento de
software claramente ainda é uma arte obscura que ainda não pode ser chamada de
uma disciplina de engenharia." - Bill Clinton
10
11. Referências
Padrão de Projeto – Composite -
http://padroesdeprojetodesoftware.blogspot.com.br/2012/06/nome-e-
classificacao-do-padrao.html
Padrões de Projeto - http://www.cin.ufpe.br/~if718/transparencias/pdf/05-
padroesGoF.pdf
Padrões de Projeto -
http://www.inf.ufsc.br/~bosco/extensao/NovosTalentos2012/D:/additional/addnlA
pps/jhtp6_appM_design_patterns.pdf
11