Padrão decorator (agregação)

Eu criei um programa usando o padrão Decorator. Quando desenho o diagrama UML com o OMONDO (plugin no eclipse), ao invés de desenhar a agregação (que está presente nesse padrão), está desenhando uma associação. Vou postar o código abaixo.

O programa, em resumo, tem um método draw que imprime um texto simples, que pode ser “enfeitado” pelo Decorator (concatenando com outra string).

Na classe abstrata Estilo, tem uma lista de objetos do tipo Tela. A classe TelaSimples é uma Tela. Nesse caso, não deveria ter desenhado uma agregação entre a classe Tela e Estilo? A lista se encontra na classe Estilo, linha 7.

O diagrama:

package gof.estrutural.decorator;

public abstract class Tela {
	
	public abstract String draw();	
}
package gof.estrutural.decorator;

public class TelaSimples extends Tela {

	@Override
	public String draw() {

		//Desenha alguma coisa.
		return "Desenhando";
	}
}
package gof.estrutural.decorator;

import java.util.List;

public abstract class Estilo extends Tela {

	private List<Tela> lista;
	private int tela;	//Pode haver diversas classes que precisam ser decoradas. No exemplo, há apenas TelaSimples.
	
	public Estilo(List<Tela> lista, int tela){
		
		this.lista = lista;
		this.tela = tela;
	}
	
	public abstract String drawStyle();
	
	@Override
	public String draw() {
		
		return lista.get(tela).draw();
	}

	public List<Tela> getLista() {
		
		return lista;
	}	
	
	public int getTela(){
		
		return tela;
	}
}
package gof.estrutural.decorator;

import java.util.List;

public class TelaEstilo1 extends Estilo {
	
	private static final String textoEstilo = " com estilo 1";
	private int tela;
		
	public TelaEstilo1(List<Tela> lista, int tela){
		
		super(lista, tela);
		this.tela = tela;
	}
	
	public String drawStyle(){
		
		return this.getLista().get(tela).draw().concat(textoEstilo);
	}

}
package gof.estrutural.decorator;

import java.util.ArrayList;
import java.util.List;

public class DecoratorMain {
	
	private static List<Tela> lista = new ArrayList<Tela>();
	
	public static void main(String[] args) {
		
		//Para adicionar Tela Simples (Caso tivessem outros classes para se adicionar estilos, era
		//só adicionar na lista)
		
		lista.add(new TelaSimples());
		
		for(int i = 0; i < lista.size(); i++){
			
			if(lista.get(i) instanceof TelaSimples){
				
				Estilo tela = new TelaEstilo1(lista, i);
				System.out.println(tela.drawStyle());
			}
		}
	}

}

Ninguém pode me ajudar?

acho que não, pois estilo já herda de tela então seria redundante.

Como que seria uma agregação, então?

o padrão decorator seria fazer uma herança e uma associação (atributo). Ali vc tem a herança entre Tela e Estilo e Estilo tem uma lista de Telas (associação). Acho que é isso…

Sim, pelas classes, o desenho está correto. A classe abstrata Estilo tem um conjunto de objetos do tipo Tela. Isso é uma associação 1-*, podendo ter entre 1 objeto e vários. Mas o padrão Decorator usa a agregação (que é um tipo de associação). Como que ficaria o código com agregação?

Pelos exemplos que procurei, não vi erro…

oi,

Segue um link

http://www.fluffycat.com/Java-Design-Patterns/Decorator/

[quote=André Fonseca]oi,

Segue um link

http://www.fluffycat.com/Java-Design-Patterns/Decorator/[/quote]

@André

Obrigado pelo link…

Eu fiz esse programa baseado no livro do Erich Gamma. A agregação está certa ou tenho que mudar algo?