Java Design Pattern: Decorator – Decorate your girlfriend
Decorator pattern adds additional features to an existing object dynamically. In this post, I will use a simple example - decorate your girlfriend - to illustrate how decorator pattern works.
1. Decorator Pattern Story
Let's assume you are looking for a girlfriend. There are girls from different countries such as America, China, Japan, France, etc. They may have different personalities and hobbies. In a dating web like eharmony.com, if each type of girl is an individual Java class, there would be thousands of classes. That is a serious problem called class explosion. Moreover, this design is not extensible. Whenever there is a new girl type, a new class needs to be created.
Let's change the design, and let each hobby/personality becomes a decorator which can be dynamically applied to a girl.
2. Class Diagram
Girl is the abstract class at the top level, we have girls from different countries. With a GirlDecorator class, we can decorator each girl with any feature by adding a new decorator.
3. Decorator pattern Java code
Girl.java
public abstract class Girl { String description = "no particular"; public String getDescription(){ return description; } } |
AmericanGirl.java
public class AmericanGirl extends Girl { public AmericanGirl(){ description = "+American"; } } |
EuropeanGirl.java
public class EuropeanGirl extends Girl { public EuropeanGirl() { description = "+European"; } } |
GirlDecorator.java
public abstract class GirlDecorator extends Girl { public abstract String getDescription(); } |
Science.java
public class Science extends GirlDecorator { private Girl girl; public Science(Girl g) { girl = g; } @Override public String getDescription() { return girl.getDescription() + "+Like Science"; } public void caltulateStuff() { System.out.println("scientific calculation!"); } } |
We can add more method like "Dance()" to each decorator without any limitations.
Art.java
public class Art extends GirlDecorator { private Girl girl; public Art(Girl g) { girl = g; } @Override public String getDescription() { return girl.getDescription() + "+Like Art"; } public void draw() { System.out.println("draw pictures!"); } } |
Main.java
package designpatterns.decorator; public class Main { public static void main(String[] args) { Girl g1 = new AmericanGirl(); System.out.println(g1.getDescription()); Science g2 = new Science(g1); System.out.println(g2.getDescription()); Art g3 = new Art(g2); System.out.println(g3.getDescription()); } } |
Output:
+American
+American+Like Science
+American+Like Science+Like Art
We can also do something like this:
Girl g = new Science(new Art(new AmericanGirl())); |
4. Decorator Pattern Used in Java Stand Library
A typical usage of Decorator pattern is Java IO classes.
Here is a simple example -
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //System.in is an InputStream object |
<pre><code> String foo = "bar"; </code></pre>
-
Anon
-
Anon
-
Karen
-
karen
-
Karthick M
-
Chess_is_great
-
Yibin
-
everrr
-
koven
-
Anom
-
Shan
-
Kevin
-
dacapo
-
qi6khan .