Difference between revisions of "Decorator"

From CDOT Wiki
Jump to: navigation, search
m
Line 1: Line 1:
Attach additional responsibility to an object dynamically. Decoratores provide a flexible alternative to subclassing for extending functionality.
+
Allow new/additional responsibility to be added to an existing object dynamically. Decoratores provide a flexible alternative to subclassing for extending functionality.
 +
 
 
[[Image:DecoratorUML.png|frame|UML Class diagram of the decorator pattern]]
 
[[Image:DecoratorUML.png|frame|UML Class diagram of the decorator pattern]]
 +
 +
==Introduction==
 +
* structual pattern
 +
* aka Wrapper
 +
* allows us to add things to a component without requiring every subclass to inherit these new qualities.
 +
* Function added at runtime through composition.
 +
* We want an object to do something new, not its class
 +
*
 +
 +
==Motivation==
  
 
==Sample Code==
 
==Sample Code==
 +
window/scrolling scenario
 +
 +
// the Window interface
 +
interface Window {
 +
    public void draw(); // draws the Window
 +
    public String getDescription(); // returns a description of the Window
 +
}
 +
 +
// implementation of a simple Window without any scrollbars
 +
class SimpleWindow implements Window {
 +
    public void draw() {
 +
        // draw window
 +
    }
 +
 +
    public String getDescription() {
 +
        return "simple window";
 +
    }
 +
}
 +
 +
The decorator classes
 +
 +
// abstract decorator class - note that it implements Window
 +
abstract class WindowDecorator implements Window {
 +
    protected Window decoratedWindow; // the Window being decorated
 +
 +
    public WindowDecorator (Window decoratedWindow) {
 +
        this.decoratedWindow = decoratedWindow;
 +
    }
 +
}
 +
 +
// the first concrete decorator which adds vertical scrollbar functionality
 +
class VerticalScrollBarDecorator extends WindowDecorator {
 +
    public VerticalScrollBarDecorator (Window decoratedWindow) {
 +
        super(decoratedWindow);
 +
    }
 +
 +
    public void draw() {
 +
        drawVerticalScrollBar();
 +
        decoratedWindow.draw();
 +
    }
 +
 +
    private void drawVerticalScrollBar() {
 +
        // draw the vertical scrollbar
 +
    }
 +
 +
    public String getDescription() {
 +
        return decoratedWindow.getDescription() + ", including vertical scrollbars";
 +
    }
 +
}
 +
 +
// the second concrete decorator which adds horizontal scrollbar functionality
 +
class HorizontalScrollBarDecorator extends WindowDecorator {
 +
    public HorizontalScrollBarDecorator (Window decoratedWindow) {
 +
        super(decoratedWindow);
 +
    }
 +
 +
    public void draw() {
 +
        drawHorizontalScrollBar();
 +
        decoratedWindow.draw();
 +
    }
 +
 +
    private void drawHorizontalScrollBar() {
 +
        // draw the horizontal scrollbar
 +
    }
 +
 +
    public String getDescription() {
 +
        return decoratedWindow.getDescription() + ", including horizontal scrollbars";
 +
    }
 +
}
 +
 +
main program
 +
public class DecoratedWindowTest {
 +
    public static void main(String[] args) {
 +
        // create a decorated Window with horizontal and vertical scrollbars
 +
        Window decoratedWindow = new HorizontalScrollBarDecorator (
 +
                new VerticalScrollBarDecorator(new SimpleWindow()));
 +
 +
        // print the Window's description
 +
        System.out.println(decoratedWindow.getDescription());
 +
    }
 +
}
 +
 +
==Example==
 +
*Decorating our Beverages
 +
*Java I/O
 +
 +
==References==
 +
Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 0-201-63361-2.
 +
http://www.dofactory.com/Patterns/PatternDecorator.aspx

Revision as of 19:58, 21 February 2007

Allow new/additional responsibility to be added to an existing object dynamically. Decoratores provide a flexible alternative to subclassing for extending functionality.

UML Class diagram of the decorator pattern

Introduction

  • structual pattern
  • aka Wrapper
  • allows us to add things to a component without requiring every subclass to inherit these new qualities.
  • Function added at runtime through composition.
  • We want an object to do something new, not its class

Motivation

Sample Code

window/scrolling scenario

// the Window interface
interface Window {
   public void draw(); // draws the Window
   public String getDescription(); // returns a description of the Window
}

// implementation of a simple Window without any scrollbars
class SimpleWindow implements Window {
   public void draw() {
       // draw window
   }

   public String getDescription() {
       return "simple window";
   }
}

The decorator classes

// abstract decorator class - note that it implements Window
abstract class WindowDecorator implements Window {
   protected Window decoratedWindow; // the Window being decorated

   public WindowDecorator (Window decoratedWindow) {
       this.decoratedWindow = decoratedWindow;
   }
}

// the first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator extends WindowDecorator {
   public VerticalScrollBarDecorator (Window decoratedWindow) {
       super(decoratedWindow);
   }

   public void draw() {
       drawVerticalScrollBar();
       decoratedWindow.draw();
   }

   private void drawVerticalScrollBar() {
       // draw the vertical scrollbar
   }

   public String getDescription() {
       return decoratedWindow.getDescription() + ", including vertical scrollbars";
   }
} 

// the second concrete decorator which adds horizontal scrollbar functionality
class HorizontalScrollBarDecorator extends WindowDecorator {
   public HorizontalScrollBarDecorator (Window decoratedWindow) {
       super(decoratedWindow);
   }

   public void draw() {
       drawHorizontalScrollBar();
       decoratedWindow.draw();
   }

   private void drawHorizontalScrollBar() {
       // draw the horizontal scrollbar
   }

   public String getDescription() {
       return decoratedWindow.getDescription() + ", including horizontal scrollbars";
   }
}

main program

public class DecoratedWindowTest {
   public static void main(String[] args) {
       // create a decorated Window with horizontal and vertical scrollbars
       Window decoratedWindow = new HorizontalScrollBarDecorator (
               new VerticalScrollBarDecorator(new SimpleWindow()));

       // print the Window's description
       System.out.println(decoratedWindow.getDescription());
   }
}

Example

  • Decorating our Beverages
  • Java I/O

References

Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 0-201-63361-2. http://www.dofactory.com/Patterns/PatternDecorator.aspx