Definição
O composite pattern ajuda você a criar estruturas de árvore de objetos sem a necessidade de forçar os clientes a diferenciar entre galhos e folhas em relação ao uso. O composite pattern permite que clientes tratem objetos individuais e composições de objetos uniformemente.
Quando usar
• Quando você quiser representar uma relação todo-parte em uma estrutura de árvore.
• Quando você quiser que os clientes sejam capazes de ignorar as diferenças entre composições de objetos e objetos individuais.
• Quando a estrutura pode ter qualquer nível de complexidade e é dinâmica.
Benefícios
• Definir hierarquias de classe constituída de objetos primitivos e objetos compostos
• Torna mais fácil a adição de um novo tipo de componentes.
Desvantagens / consequências
O padrão Composite torna mais fácil para você adicionar novos tipos de componentes a sua coleção, desde que suporte uma interface de programação similar. Por outro lado, este tem a desvantagem de tornar o sistema muito
geral. Você pode achar mais difícil para restringir determinadas categorias, quando tal, normalmente, é desejável.
Exemplo
package com.logica.composite;
public interface AbstractFile {
public void ls();
}
package com.logica.composite;
import java.util.ArrayList;
public class Directory implements AbstractFile {
private String name;
private ArrayList<AbstractFile> files = new
ArrayList<AbstractFile>();
private Indentation indentation;
public Directory (String name, Indentation indentation) {
this.name = name;
this.indentation = indentation;
}
public void add(AbstractFile f) {
files.add(f);
}
public void ls() {
System.out.println(indentation.getIndentation() + name);
indentation.increaseIndentation();
for (AbstractFile file : files) {
file.ls();
}
indentation.decreaseIndentation();
}
}
package com.logica.composite;
class File implements AbstractFile {
private String name;
private Indentation indentation;
public File(String name, Indentation indentation) {
this.name = name;
this.indentation = indentation;
}
public void ls() {
System.out.println(
indentation.getIndentation() + name);
}
}
package com.logica.composite;
public class Indentation {
private StringBuffer sbIndent = new StringBuffer();
public String getIndentation() {
return sbIndent.toString();
}
public void increaseIndentation() {
sbIndent.append(" ");
}
public void decreaseIndentation() {
if (sbIndent.length() >= 3) {
sbIndent.setLength(sbIndent.length() - 3);
}
}
}
package com.logica.composite;
public class CompositeDemo {
public static void main(String[] args) {
Indentation indentation = new Indentation();
Directory dirOne = new Directory("dir111", indentation);
Directory dirTwo = new Directory("dir222", indentation);
Directory dirThree = new Directory("dir333", indentation);
File a = new File("a", indentation);
File b = new File("b", indentation);
File c = new File("c", indentation);
File d = new File("d", indentation);
File e = new File("e", indentation);
dirOne.add(a);
dirOne.add(dirTwo);
dirOne.add(b);
dirTwo.add(c);
dirTwo.add(d);
dirTwo.add(dirThree);
dirThree.add(e);
dirOne.ls();
}
}
Quando BridgeExample é executado o resultado é:
dir111
um
dir222
c
d
dir333
dir111
um
dir222
c
d
dir333
e
b
Nenhum comentário:
Postar um comentário