Se aplica ao pettern composite?

Olá pessoal.

A pouco tempo tenho estudado um pouco sobre desing patterns.
tenho um modelo aqui que, se eu estiver correto, poderia ser aplicado o pattern composite.

Não sei se estou correto, mas o pattern composite diz que devo usa-lo quando quero tratar um objeto normal ou um conjunto de forma identica.

Está correto este modelo, ou eu estou viajando e preciso estudar mais?

Entao, seu modelo nao se aplica a um composite.
Se vc olhar aqui http://en.wikipedia.org/wiki/Image:Composite_UML_class_diagram.svg verá q um composite contem uma recursao. Isso faz com q um composite possa ser representado numa estrutura de arvore.
O melhor exemplo de composite eh a estrutura de diretorios do seu computador.

Fazendo uma analogia com o ex q te passei, Leaf seria um arquivo, Composite seria um diretorio e Componente é uma abstração q poderiamos chamar de ItemDeDiretorio.

Compare com o seu modelo, e vc verá q nao se trata de um composite.

Dê uma olhada nesse artigo
http://www.javaworld.com/javaworld/jw-09-2002/jw-0913-designpatterns.html?

Muito bom!!

:smiley:

Priscila Vriesman

Ainda fico na duvida, pois, da maneira que vejo, eu posso utiliza-lo como uma arvore.
Por exemplo ao invés de Carro, Moto e caminhão herdarem de automóvel, eu poderia fazer assim:

Carro herda de VeiculoQuatroRodas
Moto herda de VeiculoDuasRodas
Bicicleta herda de VeiculoDuasRodas
e
VeiculoDuasRodas herda de Automovel
VeiculoQuatroRodas herda de Automovel

onde as classes:
Trem, Navio, Caminhao, Aviao e Helicoptero seriam as Leaf
Automovel, AeroNave, VeiculoDuasRodas, VeiculoQuatroRodas seriam os Composites
Produto seria o Component

Acho q entendi o q vc quer. Vc está querendo criar uma estrutura hierarquica para os veiculos.
Entao, seria algo assim:

Leaf -> Veiculo
Composite -> GrupoDeVeiculo
Component -> Produto (qq abastração)

Aí vc poderiar criar um GrupoDeVeiculo com o nome "VeiculoTerrestre"
dentro de “VeiculoTerrestre” poderia adicionar “Veiculo2Rodas” e "Veiculo4Rodas"
dentro de “Veiculo4Rodas” adicionaria "Carro"
dentro de “Carro” adicionaria objetos da classe Veiculo: “Uno”, “Gol”, etc.

Bom, nesse caso vc teria apenas 3 classes. Nao seriam necessarias, a principio, classe Trem, Carro, VeiculoDuasRodas , etc.

Era mais ou menos isso?

É isso que eu estou falando. Isso me parece ser uma situação onde posso aplicar um Composite.

Se realmente essa idéia não for correta, como posso criar essa arquitetura, sendo que futuramente serão adicionados novos produtos? Como fazer isso de maneira que não afete meu sistema quando adicionar um novo produto?

Talvez eu esteja no caminho errado. Porque eu preciso de um Produto, e os produtos podem ser Carro, Avião, SalaComercial, Software e etc, e apesar de todos eles serem produtos, não tem muitas características em comum. Acho que usar herança aqui não eh o caminho mais correto.

Alguma Dica?

Eu disse q “a principio” vc soh precisaria criar 3 classes, mas vc pode sim criar classes q herdem veiculo. Nao haverá diferença alguma quando vc for manipular seu conjunto.

Mas, de fato, pode ser que vc esteja no caminho errado. Eu nao sei qual o seu problema, portanto fica dificil opinar.

Eu não posso dizer do que se trata, pois o cliente exigiu sigilo.
Mas o problema é mais ou menos como eu descrevi acima:
Hoje eu tenho um produto, vamos dizer que seja Carro. Daqui a algum tempo, vai ter mais produtos que podem ser bem diferentes de Carro. Eu preciso de um modelo que quando for necessário acrescentar mais um produto, não tenha que fazer uma grande mudança.

E é esse modelo que estou com dificuldades de implementar.

[quote=marcosbrandao]Eu não posso dizer do que se trata, pois o cliente exigiu sigilo.
Mas o problema é mais ou menos como eu descrevi acima:
Hoje eu tenho um produto, vamos dizer que seja Carro. Daqui a algum tempo, vai ter mais produtos que podem ser bem diferentes de Carro. Eu preciso de um modelo que quando for necessário acrescentar mais um produto, não tenha que fazer uma grande mudança.

E é esse modelo que estou com dificuldades de implementar.

[/quote]

O composite (composição) é um padrão para compor coisas, ou seja: A é composto de B

Carro não é composto de Veiculo4Rodas , Carro é-um Veiculo4Rodas.
Exatamente porque ele é-um Veiculo4Rodas que vc herda dessa classe. Se herda não é composto. Se é composto, não herda.

Para vc ter uma ideia onde aplica o composite. Carro é composto de motor, rodas, tanque, etc…
É claro isto ?

Agora, vc pode ter um produto generico e ele ser composto de outros. Exemplo :
Produto A = Pacote de Leite 1L
Produto B = Pack de Leite (12L) que é composto de 12 produtos A