Электротовары. Корейская инфракрасная лампа с большими скидками для постоянных покупателей.

Композит (Composite)

Важнейшей вещью в этом вопросе является то, что все элементы, являющиеся частью целого, имеют операции, и если эти операции выполняются над нодами/композитом, они также выполняются над любой дочкой этой ноды/композита. GoF включает детали реализации содержания и просмотр детей в интерфейс базового класса, но это не кажется необходимым. В следующем примере класс Composite просто наследует от ArrayList, чтобы получить возможность контейнирования.

The important thing here is that all elements in the part-whole have operations, and that performing an operation on a node/composite also performs that operation on any children of that node/composite. GoF includes implementation details of containment and visitation of children in the interface of the base class, but this doesn’t seem necessary. In the following example, the Composite class simply inherits ArrayList in order to gain its containment abilities.

//: composite:CompositeStructure.java
package composite;

import java.util.*;

import junit.framework.*;

interface Component {
  
void operation();
}

class Leaf implements Component {
  
private String name;
  
  
public Leaf(String name) {
     
this.name = name;
  
}
  
  
public String toString() {
     
return name;
  
}
  
  
public void operation() {
     
System.out.println(this);
  
}
}

class Node extends ArrayList implements Component {
  
private String name;
  
  
public Node(String name) {
     
this.name = name;
  
}
  
  
public String toString() {
     
return name;
  
}
  
  
public void operation() {
     
System.out.println(this);
     
for (Iterator it = iterator(); it.hasNext();)
         ((
Component) it.next()).operation();
  
}
}

public class CompositeStructure extends TestCase {
  
public void test() {
     
Node root = new Node("root");
      root.add
(new Leaf("Leaf1"));
      Node c2 =
new Node("Node1");
      c2.add
(new Leaf("Leaf2"));
      c2.add
(new Leaf("Leaf3"));
      root.add
(c2);
      c2 =
new Node("Node2");
      c2.add
(new Leaf("Leaf4"));
      c2.add
(new Leaf("Leaf5"));
      root.add
(c2);
      root.operation
();
  
}
  
  
public static void main(String args[]) {
     
junit.textui.TestRunner.run(CompositeStructure.class);
  
}
}
// /:~

Пока этот подход выглядит, как "простейшая вещь, которая может работать", но возможно, что в больших системах число проблем может увеличиться. Однако, возможно лучше начать с простейшего подхода и изменить его, если того потребует ситуация.