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());
}
}
}
}