Design Pattern Java

/*
Software Architecture Design Patterns in Java
by Partha Kuchana 
Auerbach Publications
*/
import java.util.Enumeration;
import java.util.Vector;
public class CompositeDemo {
  public static final String SEPARATOR = ", ";
  public static void main(String[] args) {
    FileSystemComponent mainFolder = new DirComponent("Year2000");
    FileSystemComponent subFolder1 = new DirComponent("Jan");
    FileSystemComponent subFolder2 = new DirComponent("Feb");
    FileSystemComponent folder1File1 = new FileComponent(
        "Jan1DataFile.txt", 1000);
    FileSystemComponent folder1File2 = new FileComponent(
        "Jan2DataFile.txt", 2000);
    FileSystemComponent folder2File1 = new FileComponent(
        "Feb1DataFile.txt", 3000);
    FileSystemComponent folder2File2 = new FileComponent(
        "Feb2DataFile.txt", 4000);
    try {
      mainFolder.addComponent(subFolder1);
      mainFolder.addComponent(subFolder2);
      subFolder1.addComponent(folder1File1);
      subFolder1.addComponent(folder1File2);
      subFolder2.addComponent(folder2File1);
      subFolder2.addComponent(folder2File2);
    } catch (CompositeException ex) {
      //
    }
    //Client refers to both composite &
    //individual components in a uniform manner
    System.out.println(" Main Folder Size= "
        + mainFolder.getComponentSize() + "kb");
    System.out.println(" Sub Folder1 Size= "
        + subFolder1.getComponentSize() + "kb");
    System.out.println(" File1 in Folder1 size= "
        + folder1File1.getComponentSize() + "kb");
  }
}
class FileComponent extends FileSystemComponent {
  private long size;
  public FileComponent(String cName, long sz) {
    super(cName);
    size = sz;
  }
  public long getComponentSize() {
    return size;
  }
} // End of class
abstract class FileSystemComponent {
  String name;
  public FileSystemComponent(String cName) {
    name = cName;
  }
  public void addComponent(FileSystemComponent component)
      throws CompositeException {
    throw new CompositeException("Invalid Operation. Not Supported");
  }
  public FileSystemComponent getComponent(int componentNum)
      throws CompositeException {
    throw new CompositeException("Invalid Operation. Not Supported");
  }
  public abstract long getComponentSize();
} // End of class FileSystemComponent
class CompositeException extends Exception {
  public CompositeException(String msg) {
    super(msg);
  }
} // End of class
class DirComponent extends FileSystemComponent {
  Vector dirContents = new Vector();
  //individual files/sub folders collection
  public DirComponent(String cName) {
    super(cName);
  }
  public void addComponent(FileSystemComponent fc) throws CompositeException {
    dirContents.add(fc);
  }
  public FileSystemComponent getComponent(int location)
      throws CompositeException {
    return (FileSystemComponent) dirContents.elementAt(location);
  }
  public long getComponentSize() {
    long sizeOfAllFiles = 0;
    Enumeration e = dirContents.elements();
    while (e.hasMoreElements()) {
      FileSystemComponent component = (FileSystemComponent) e
          .nextElement();
      sizeOfAllFiles = sizeOfAllFiles + (component.getComponentSize());
    }
    return sizeOfAllFiles;
  }
} // End of class