JMU
The Command Pattern
An Introduction with Examples in Java


Prof. David Bernstein
James Madison University

Computer Science Department
bernstdh@jmu.edu


Overview
A Model of the Command Pattern

In UML

images/command.gif
Improving this Model
An Example
javaexamples/command/TextDocument.java
        /**
 * A very simple text document used in an example of the Command pattern
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class TextDocument
{
    private String      text;

    
    /**
     * Default Constructor
     */
    public TextDocument()
    {
        text = null;
    }



   /**
    * Get the text
    *
    * @return      The text
    */
    public String getText()
    {
        return text;
    }
 


    
    /**
     * Replace all occurences of one word with another
     *
     * @param oldWord   The old word
     * @param newWord   The new word
     */
    public void replace(String oldWord, String newWord)
    {
        text = text.replaceAll(oldWord, newWord);
    }



   /**
    * Set the text
    *
    * @param text      The text
    */
    public void setText(String text)
    {
        this.text = text;
    }
 
}
        
An Example (cont.)
javaexamples/command/Replace.java
        /**
 * A very simple operation used in an example of the Command pattern
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class Replace
{
    private boolean           applied;
    private String            newWord, oldWord, savedState;
    private TextDocument      operand;


    /**
     * Explicit Value Constructor
     *
     * @param document   The operand of this operation
     *
     * @param oldWord   The old word
     * @param newWord   The new word
     */
    public Replace(TextDocument  document, String oldWord, String newWord)
    {
        operand = document;
        applied = false;
        this.oldWord = oldWord;
        this.newWord = newWord;
    }



    /**
     * Apply this Replace operation
     */
    public void apply()
    {
        savedState = operand.getText();
        operand.replace(oldWord, newWord);
        applied = true;
    }


    /**
     * Undo this Replace operation
     */
    public void undo()
    {
        if (applied) 
        {
            operand.setText(savedState);
            applied = false;
        }
    }
}
        
An Example (cont.)
javaexamples/command/Driver.java
        /**
 * A simple example of the Command pattern
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class Driver
{
    /**
     * The entry point
     *
     * @param args   The command-line arguments
     */
    public static void main(String[] args)
    {
        int              i;
        TextDocument     document;
        Replace[]        replace;


        document = new TextDocument();
        document.setText("George is a little monkey, "+
                         "and all monkeys are curious. "+
                         "But no monkey is as curious "+
                         "as George.");

        System.out.println("\n"+document.getText()+"\n");


        replace = new Replace[3];
        replace[0] = new Replace(document,"curious","power hungry");
        replace[1] = new Replace(document,"monkey", "President");
        replace[2] = new Replace(document,"little", "U.S.");


        for (i=0; i < replace.length; i++) {
            
            replace[i].apply();
            System.out.println("\n"+document.getText()+"\n");
        }

        for (i=replace.length-1; i >= 0; i--) {
            
            replace[i].undo();
            System.out.println("\n"+document.getText()+"\n");
        }


    }
}