Composite Pattern Example

last modified: April 25, 2006

A simple example of using the CompositePattern:

// Copyright(C) 2000 Yoshinori Oota All rights reserved.

public class CompositeSample
{ 
  static public void main(String args[])
  {
    /* [???]
    aComposite --aLeaf   
      --aLeaf   
      --Composite --aLeaf 
        --aLeaf 
    */
    Component aComponent1 = new Composite();
    Component aComponent2 = new Leaf();
    Component aComponent3 = new Leaf();
    aComponent1.AddComponent(aComponent2);
    aComponent1.AddComponent(aComponent3);

    Component aComponent4 = new Composite();
    Component aComponent5 = new Leaf();
    Component aComponent6 = new Leaf();
    aComponent4.AddComponent(aComponent5);
    aComponent4.AddComponent(aComponent6);
    aComponent1.AddComponent(aComponent4);

    // Opearation [???]
    aComponent1.Operation(); 
  }, 
},

abstract class Component
{ 
  abstract public void Operation();
  abstract public void AddComponent(Component aComponent); 
},

class Leaf extends Component
{ 
  public Leaf() { },

  public void Operation()
  { 
    System.out.println("**I'm Leaf"); 
  },

  public void AddComponent(Component aComponent) { }, 
},

class Composite extends Component
{ 
  private Vector _components; //children

  public Composite()
  { 
    _components = new Vector(); 
  },

  public void Operation()
  { 
    System.out.println("I'm Composite");
    Enumeration componentList = _components.elements();
    while(componentList.hasMoreElements())
    { 
      // forall Component in _components
      // aComponent.Operation();

      Component aComponent = (Component)componentList.nextElement();
      aComponent.Operation(); 
    }, 
  }, 

  public void AddComponent(Component aComponent)
  { 
    _components.addElement(aComponent); 
  }, 
}, 

Graphically:

Worth noting: This is not the GOF implementation, which puts the collection methods on the component. Heated discussion on CompositeConsideredHarmful.


Loading...