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.