Home
Core Java
Java
JDBC
Servlets
JSP
EJB
JMS
Struts
Spring
Hibernate
JSF
RMI
CORBA
J2ME
Performance
Tomcat
Weblogic
Design Patterns
Junit
XML
UML
DB2 & SQL
ANT
Free Gift
Contact Us

XML RSS
What is this?
Add to My Yahoo!
Add to My MSN
Add to Google
 

Structural Pattern

Decorator Pattern

Your Ad Here

Creational patterns Structural patterns Behavioral pattern J2EE patterns
Abstract Factory Adapter  Chain of Responsibility
MVC 
Builder Bridge  Command  Business Delegate
Factory method Composite  Interpreter  Composite Entity
Prototype Decorator  Iterator  Data Access Object
Singleton Façade
Mediator  Front Controller

Flyweight  Memento  Intercepting Filter

Proxy  Observer  Service Locator


State  Transfer Object


Strategy 


Template Method



Visitor 

Decorator Pattern



Define decorator pattern
Attach additional responsibilities or functions to an object dynamically or statically. Also known as Wrapper.

Where to use & benefits
Provide an alternative to subclassing.
Add new function to an object without affecting other objects.
Make a responsibility easily added and removed dynamically.
More flexibility than static inheritance.
Transparent to the object.

Related patterns include
  • Adapter pattern, which provides a different interface to the object it adapts, whereas a decorator changes an object's responsibilities,
  • Proxy pattern, which controls access to the object, whereas a decorator focuses on adding new functions to an object,
  • Composite pattern, which aggregates an object, whereas a decorator adds additional responsibilities to an object, and
  • Strategy pattern, which changes the guts of an object, whereas a decorator changes the skin of an object.
  • Facade pattern, which provides a way of hiding a complex class, whereas a decorator adds function by wrapping a class.

Your Ad Here
Example of decorator pattern
A JScrollPane object can be used to decorate a JTextArea object or a JEditorPane object. A window can be decorated with different borders like BevelBorder, CompoundBorder, EtchedBorder TitledBorder etc. These border classes working as decorators are provided in Java API.

Decorator pattern can be used in a non-visual fashion. For example, BufferedInputStream, DataInputStream, and CheckedInputStream are decorating objects of FilterInputStream class. These decorators are standard Java API classes.

To illustrate a simple decorator pattern in non-visual manner, we design a class that prints a number. We create a decorator class that adds a text to the Number object to indicate that such number is a random number. Of course we can subclass the Number class to achieve the same goal. But the decorator pattern provides us an alternative way.

import java.util.Random;
class Number {
   public void print() {
       System.out.println(new Random().nextInt());
   }
}

class Decorator {
    public Decorator() {
        System.out.print("Random number: ");//add a description to the number printed
        new Number().print();
    }
}

class SubNumber extends Number{
    public SubNumber() {
       super();
       System.out.print("Random number: ");
       print();
    }
}

class Test {
    public static void main(String[] args) {
        new Decorator();
        new SubNumber();
    }
}

Output :
Random number: 145265744
Random number: 145265755


Your Ad Here




footer for Decorator Pattern page