public abstract class Component {
  protected String name;
  protected String type;
  
  protected void setType(String type) {
    this.type=type;
  }
  protected final String getType() {
    return type;
  }
  protected void setName(String name) {
    this.name=name;
  }
  protected final String getName() {
    return name;
  }
  public abstract void print();
}
import java.util.ArrayList;
import java.util.Iterator;
public class Composite extends Component {
  protected ArrayList<Component>list=new ArrayList<Component>();
  
  public Composite() {
    
  }
  protected void add(Component c) {
    this.list.add(c);
  }
  protected void remove(Component c) {
    if(this.list.isEmpty()==false) this.list.remove(c);
  }
  protected void remove(int index) {
    if(index <0 || index>=this.getSize()) {
      System.out.println("out of bound!");
      return;
    }
    else this.list.remove(index);
  }
  protected final Component getComponent(int index) {
    if(index <0 || index>=this.getSize()) return null;
    else return this.list.get(index);
  }
  protected final int getSize() {
    return this.list.size();
  }
  @Override
  public void print() {
    // TODO Auto-generated method stub
    System.out.println("I am: "+this.getType());
    System.out.println("My name is: "+this.getName());
    Iterator<Component>iterator=list.iterator();
    while(iterator.hasNext()) {
      iterator.next().print();  
        System.out.println("I belong to: "+this.getName());
    }
  }
}
public class Leaf extends Component {
  public Leaf(String name) {
    this.setName(name);
    this.setType("leaf");
  }
  @Override
  public void print() {
    // TODO Auto-generated method stub
    System.out.println("I am: "+this.getType());
    System.out.println("My name : "+this.getName());
  }
  
}
public class Branches extends Composite {
  public Branches(String name) {
    super();
    this.setName(name);
    this.setType("Branches");
  }
  public Branches() {
    
  }
}
public class Tree extends Branches {
  public Tree(String name) {
    super();
    // TODO Auto-generated constructor stub
    this.setName(name);
    this.setType("Tree");
  }
}
public class Client {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Leaf leaf1=new Leaf("leaf1");
    Leaf leaf2=new Leaf("leaf2");
    Leaf leaf3=new Leaf("leaf3");
    Leaf leaf4=new Leaf("leaf4");
    
    Branches branches1=new Branches("branches1");
    Branches branches2=new Branches("branches2");
    branches1.add(leaf1);
    branches1.add(leaf2);
    branches2.add(leaf3);
    branches2.add(leaf4);
    
    Tree tree=new Tree("Binary Tree");
    tree.add(branches1);
    tree.add(branches2);
    tree.print();
  }
}测试:
I am: Tree
My name is: Binary Tree
I am: Branches
My name is: branches1
I am: leaf
My name : leaf1
I belong to: branches1
I am: leaf
My name : leaf2
I belong to: branches1
I belong to: Binary Tree
I am: Branches
My name is: branches2
I am: leaf
My name : leaf3
I belong to: branches2
I am: leaf
My name : leaf4
I belong to: branches2
I belong to: Binary Tree










