Decorator Pattern in Java

Arjun Sunil Kumar
Software Engineering
2 min readAug 17, 2018

As the name suggests, it is all about decorating a solid entity.

Why Decorator ?

Let’s see this through an example!

Decorating the nucleus of an atom😅

In a game, we created a class Atom. Different atoms have different degree of motion. Say for e.g. :-

Atom 1, has only 1 degree of motion — along x-axis
Atom 2, has 2 degree of motion — along x & y axis
Atom 3, has again 2 degree of motion — along y & z axis

Creating a separate class to handle this would be a tedious task. For e.g. :- MovableX, MovableXZ, MovableYZ … etc.

One alternative is to follow Decorator Pattern. ( Because less code duplication).

Create MovableX, MovableY, MovableZ and then use the combinations to dynamically add additional responsibility to individual atom.

E.g. :-

For MovableXY class, we could do create this

IAtom atom_x_y = new MovableX( new MovableY( new Atom() ) )

Project Structure:

Implementation in Java:

Yet another different example!

Take the example of a Window View(solid entity). Suppose we have to decorate Window with a new property Scrolling (additional responsibility).

Number of possible combinations(here combination is fine, rather than permutation)→ Horizontal, Vertical, Horizontal_&_Vertical.

Lets see how decorator could be used in this case.

  1. Create an Interface (code to interface not to implementation)

IWindow.java

2. Create a solid entity (Implementing the Interface)

BasicWindow.java

3. Create an Abstract Scrollable Decorator which accommodates the solid entity.

ScrollDecorator.java

4. Create Decorator Classes from Scroll-Decorator

NOTE:

  • window object is present in the Abstract class.
  • Scroll logic can be included inside the render().

VerticalScrollDecorator.java

HorizontalScrollDecorator.java

5. Driver Program

DecoratorDriver.java

  • IWindow is used rather than any Concrete class.
  • Note the order, of calling constructors.

Found it Interesting?

Please show your support by 👏. To read the complete series, click below.

Reference:

Disclaimer:
I myself, has just started learning, design patterns. If you find any issues please feel free to post them in the comments section below. Thank you for reading so far 😄

--

--

Arjun Sunil Kumar
Software Engineering

Writes on Database Kernel, Distributed Systems, Cloud Technology, Data Engineering & SDE Paradigm. github.com/arjunsk