Structural Design Patterns (4 Part Series)
1 Structural Design Patterns
2 Adapter Design Pattern step by step
3 Decorator Pattern Step by step
4 Composite Design Pattern in Java
The Decorator Pattern is a design pattern that allows you to add new behaviors or responsibilities to objects dynamically. Imagine you have a base object, and you want to enhance it without changing its core structure. Let’s break it down step by step:
Step 1: Create a Component Interface
- Interface/Abstract Class: Start by defining an interface or an abstract class that represents the base object you want to decorate. This is your “Component.”
<span>interface</span> <span>Component</span> <span>{</span><span>String</span> <span>operation</span><span>();</span><span>}</span><span>interface</span> <span>Component</span> <span>{</span> <span>String</span> <span>operation</span><span>();</span> <span>}</span>interface Component { String operation(); }
Enter fullscreen mode Exit fullscreen mode
Step 2: Create a Concrete Component
- Concrete Component: Implement the interface with a concrete class that represents the basic or plain object. This is your starting point.
<span>class</span> <span>ConcreteComponent</span> <span>implements</span> <span>Component</span> <span>{</span><span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span><span>return</span> <span>"This is the core component."</span><span>;</span><span>}</span><span>}</span><span>class</span> <span>ConcreteComponent</span> <span>implements</span> <span>Component</span> <span>{</span> <span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span> <span>return</span> <span>"This is the core component."</span><span>;</span> <span>}</span> <span>}</span>class ConcreteComponent implements Component { public String operation() { return "This is the core component."; } }
Enter fullscreen mode Exit fullscreen mode
Step 3: Create Decorator Classes
- Decorator Classes: Create decorator classes by implementing the component interface. Decorators wrap the base object and enhance its functionality.
<span>class</span> <span>Decorator</span> <span>implements</span> <span>Component</span> <span>{</span><span>private</span> <span>Component</span> <span>component</span><span>;</span><span>public</span> <span>Decorator</span><span>(</span><span>Component</span> <span>component</span><span>)</span> <span>{</span><span>this</span><span>.</span><span>component</span> <span>=</span> <span>component</span><span>;</span><span>}</span><span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span><span>return</span> <span>component</span><span>.</span><span>operation</span><span>();</span><span>}</span><span>}</span><span>class</span> <span>Decorator</span> <span>implements</span> <span>Component</span> <span>{</span> <span>private</span> <span>Component</span> <span>component</span><span>;</span> <span>public</span> <span>Decorator</span><span>(</span><span>Component</span> <span>component</span><span>)</span> <span>{</span> <span>this</span><span>.</span><span>component</span> <span>=</span> <span>component</span><span>;</span> <span>}</span> <span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span> <span>return</span> <span>component</span><span>.</span><span>operation</span><span>();</span> <span>}</span> <span>}</span>class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } public String operation() { return component.operation(); } }
Enter fullscreen mode Exit fullscreen mode
Step 4: Create Concrete Decorators
- Concrete Decorators: Implement concrete decorator classes by extending the decorator class and adding new behavior. These classes modify the behavior of the base component.
<span>class</span> <span>ConcreteDecoratorA</span> <span>extends</span> <span>Decorator</span> <span>{</span><span>public</span> <span>ConcreteDecoratorA</span><span>(</span><span>Component</span> <span>component</span><span>)</span> <span>{</span><span>super</span><span>(</span><span>component</span><span>);</span><span>}</span><span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span><span>return</span> <span>"Decorator A: "</span> <span>+</span> <span>super</span><span>.</span><span>operation</span><span>();</span><span>}</span><span>}</span><span>class</span> <span>ConcreteDecoratorB</span> <span>extends</span> <span>Decorator</span> <span>{</span><span>public</span> <span>ConcreteDecoratorB</span><span>(</span><span>Component</span> <span>component</span><span>)</span> <span>{</span><span>super</span><span>(</span><span>component</span><span>);</span><span>}</span><span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span><span>return</span> <span>"Decorator B: "</span> <span>+</span> <span>super</span><span>.</span><span>operation</span><span>();</span><span>}</span><span>}</span><span>class</span> <span>ConcreteDecoratorA</span> <span>extends</span> <span>Decorator</span> <span>{</span> <span>public</span> <span>ConcreteDecoratorA</span><span>(</span><span>Component</span> <span>component</span><span>)</span> <span>{</span> <span>super</span><span>(</span><span>component</span><span>);</span> <span>}</span> <span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span> <span>return</span> <span>"Decorator A: "</span> <span>+</span> <span>super</span><span>.</span><span>operation</span><span>();</span> <span>}</span> <span>}</span> <span>class</span> <span>ConcreteDecoratorB</span> <span>extends</span> <span>Decorator</span> <span>{</span> <span>public</span> <span>ConcreteDecoratorB</span><span>(</span><span>Component</span> <span>component</span><span>)</span> <span>{</span> <span>super</span><span>(</span><span>component</span><span>);</span> <span>}</span> <span>public</span> <span>String</span> <span>operation</span><span>()</span> <span>{</span> <span>return</span> <span>"Decorator B: "</span> <span>+</span> <span>super</span><span>.</span><span>operation</span><span>();</span> <span>}</span> <span>}</span>class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public String operation() { return "Decorator A: " + super.operation(); } } class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public String operation() { return "Decorator B: " + super.operation(); } }
Enter fullscreen mode Exit fullscreen mode
Step 5: Putting It All Together
- Usage: In your application, you can create an instance of the base component and then wrap it with one or more decorators to enhance its behavior.
<span>public</span> <span>class</span> <span>Main</span> <span>{</span><span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(</span><span>String</span><span>[]</span> <span>args</span><span>)</span> <span>{</span><span>Component</span> <span>component</span> <span>=</span> <span>new</span> <span>ConcreteComponent</span><span>();</span><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>component</span><span>.</span><span>operation</span><span>());</span><span>Component</span> <span>decoratedA</span> <span>=</span> <span>new</span> <span>ConcreteDecoratorA</span><span>(</span><span>component</span><span>);</span><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>decoratedA</span><span>.</span><span>operation</span><span>());</span><span>Component</span> <span>decoratedB</span> <span>=</span> <span>new</span> <span>ConcreteDecoratorB</span><span>(</span><span>component</span><span>);</span><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>decoratedB</span><span>.</span><span>operation</span><span>());</span><span>Component</span> <span>decoratedAB</span> <span>=</span> <span>new</span> <span>ConcreteDecoratorA</span><span>(</span><span>new</span> <span>ConcreteDecoratorB</span><span>(</span><span>component</span><span>));</span><span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>decoratedAB</span><span>.</span><span>operation</span><span>());</span><span>}</span><span>}</span><span>public</span> <span>class</span> <span>Main</span> <span>{</span> <span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(</span><span>String</span><span>[]</span> <span>args</span><span>)</span> <span>{</span> <span>Component</span> <span>component</span> <span>=</span> <span>new</span> <span>ConcreteComponent</span><span>();</span> <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>component</span><span>.</span><span>operation</span><span>());</span> <span>Component</span> <span>decoratedA</span> <span>=</span> <span>new</span> <span>ConcreteDecoratorA</span><span>(</span><span>component</span><span>);</span> <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>decoratedA</span><span>.</span><span>operation</span><span>());</span> <span>Component</span> <span>decoratedB</span> <span>=</span> <span>new</span> <span>ConcreteDecoratorB</span><span>(</span><span>component</span><span>);</span> <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>decoratedB</span><span>.</span><span>operation</span><span>());</span> <span>Component</span> <span>decoratedAB</span> <span>=</span> <span>new</span> <span>ConcreteDecoratorA</span><span>(</span><span>new</span> <span>ConcreteDecoratorB</span><span>(</span><span>component</span><span>));</span> <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>decoratedAB</span><span>.</span><span>operation</span><span>());</span> <span>}</span> <span>}</span>public class Main { public static void main(String[] args) { Component component = new ConcreteComponent(); System.out.println(component.operation()); Component decoratedA = new ConcreteDecoratorA(component); System.out.println(decoratedA.operation()); Component decoratedB = new ConcreteDecoratorB(component); System.out.println(decoratedB.operation()); Component decoratedAB = new ConcreteDecoratorA(new ConcreteDecoratorB(component)); System.out.println(decoratedAB.operation()); } }
Enter fullscreen mode Exit fullscreen mode
Output:
This is the core component.Decorator A: This is the core component.Decorator B: This is the core component.Decorator A: Decorator B: This is the core component.This is the core component. Decorator A: This is the core component. Decorator B: This is the core component. Decorator A: Decorator B: This is the core component.This is the core component. Decorator A: This is the core component. Decorator B: This is the core component. Decorator A: Decorator B: This is the core component.
Enter fullscreen mode Exit fullscreen mode
In this step-by-step explanation, we’ve shown how the Decorator Pattern allows you to add functionality to objects at runtime without modifying their original code, making it a flexible and powerful design pattern in software development.
If you enjoy the content, please like, share, and follow for more updates!
Join me on a professional journey through my LinkedIn profile: Linkedin Profile
Structural Design Patterns (4 Part Series)
1 Structural Design Patterns
2 Adapter Design Pattern step by step
3 Decorator Pattern Step by step
4 Composite Design Pattern in Java
暂无评论内容