Decorator Pattern Step by step

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

  1. 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

  1. 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

  1. 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

  1. 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

  1. 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

原文链接:Decorator Pattern Step by step

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
As long as there s tomorrow, today s always the startng lne.
只要还有明天,今天就永远是起跑线
评论 抢沙发

请登录后发表评论

    暂无评论内容