JMU
The Composite Pattern
An Introduction with Examples in Java


Prof. David Bernstein
James Madison University

Computer Science Department
bernstdh@jmu.edu


Motivation
One Version

In UML:

images/composite.gif
An Example

A Message Distribution System

images/composite_example.gif
An Example (cont.)
javaexamples/composite/Distribution.java
/**
 * Requirements of a Distribution (i.e., where a message
 * can be sent) in a distribution system.
 *
 * @author  Prof. David Bernstein, James Madison University 
 * @version 1.0
 */
public interface Distribution
{
    /**
     * Send a message.
     *
     * @param msg   The message to send
     */
    public void sendMessage(String msg);
}
        
An Example (cont.)
javaexamples/composite/DistributionList.java
import java.util.*;

/**
 * An encapsulation of a DistributionList.
 *
 * @author  Prof. David Bernstein, James Madison University 
 * @version 1.0
 */
public class DistributionList implements Distribution
{
    private Collection<Distribution>  aggregate;


    /**
     * Default Constructor
     */
    public DistributionList()
    {
       aggregate = new HashSet<Distribution>();
    }


    /**
     * Add a Distribution to this DistributionList
     *
     * @param d   The Distribution to add
     */
    public void add(Distribution d)
    {
       aggregate.add(d);
    }



    /**
     * Send a message to this DistributionList
     * (required by Distribution)
     *
     * @param out   The PrintStream to print on
     */
    public void sendMessage(String msg)
    {
        for (Distribution d: aggregate)
        {
            d.sendMessage(msg);
        }
    }



    /**
     * Remove a Distribution from this DistributionList
     *
     * @param d   The Distribution to remove
     */
    public void remove(Distribution d)
    {
       aggregate.remove(d);
    }
}
        
An Example (cont.)
javaexamples/composite/Driver.java
/**
  * An example of the Composite Pattern
  *
  * @author  Prof. David Bernstein, James Madison University 
  * @version 1.0
  */
public class Driver
{
    /**
     * The entry-point of the application
     *
     * @param args   The command-line arguments
     */
    public static void main(String[] args)
    {

       DistributionList         cs, math, spam;
       EmailAddress             dean;


       spam = new DistributionList();
       dean = new EmailAddress("Tex Avery", 
                               "tex@hollywood.edu");
        
       cs = new DistributionList();
       cs.add(new EmailAddress("Gilligan", 
                               "littlebuddy@island.edu"));
       cs.add(new EmailAddress("The Skipper",
                               "skipper@island.edu"));
       cs.add(new EmailAddress("Mr. and Mrs. Howell", 
                               "magoo@island.edu"));

       math = new DistributionList();
       math.add(new EmailAddress("Fred Flintstone",
                                 "bedrock.edu"));
       math.add(new EmailAddress("Barney Rubble",
                                 "bedrock.edu"));
       math.add(new EmailAddress("Stony Curtis", 
                                 "hollyrock.edu"));

       spam.add(cs);
       spam.add(math);
       spam.add(dean);

       spam.sendMessage("Buy my book!");        
    }
}