 |
| |
Structural Pattern
Decorator Pattern
|
|
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.
|
|
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
|
|
|

|
|