Decorator pattern is used to attach a new functionality to an existing object, without changing the existing class.
Check complete details and explanations about the Decorator pattern in the article: Decorator Design Pattern
This article demonstrates Decorator pattern implementations in Java. Check the following examples.
Example #1: Data Export
Let’s take a look at how we can use the Decorator pattern which deals with data export. We have an existing class for export named SimpleExport, which implements an interface named DataExport. We want to extend the export functions capability and want to export data to CSV, Excel, and JSON.
Class Diagram
Take a look at the class diagram. Two classes are used for Decorator pattern for data export.

Existing Classes
DataExport Interface
// DataExport.java
package com.bigboxcode.com.bigboxcode.decorator;
public interface DataExport {
void processData();
}
SimpleExport Class
// SimpleExport.java
package com.bigboxcode.com.bigboxcode.decorator;
public class SimpleDataExport implements DataExport {
@Override
public void processData() {
System.out.println("Processing Data");
}
}
Decorator Classes
Main Decorator Class
// DataExportDecorator.java
package com.bigboxcode.com.bigboxcode.decorator;
public abstract class DataExportDecorator implements DataExport {
protected final DataExport dataExporter;
public DataExportDecorator(DataExport dataExporter) {
this.dataExporter = dataExporter;
}
@Override
public void processData() {
this.dataExporter.processData();
}
}
CSV Decorator Class
// CsvDataExportDecorator.java
package com.bigboxcode.com.bigboxcode.decorator;
public class CsvDataExportDecorator extends DataExportDecorator {
public CsvDataExportDecorator(DataExport dataExporter) {
super(dataExporter);
}
@Override
public void processData() {
dataExporter.processData();
this.processCsv();
}
private void processCsv() {
System.out.println("Processed data to CSV");
}
}
Excel Decorator Class
// ExcelDataExportDecorator.java
package com.bigboxcode.com.bigboxcode.decorator;
public class ExcelDataExportDecorator extends DataExportDecorator {
public ExcelDataExportDecorator(DataExport dataExporter) {
super(dataExporter);
}
@Override
public void processData() {
dataExporter.processData();
this.processExcel();
}
private void processExcel() {
System.out.println("Processed data to Excel");
}
}
JSON Decorator Class
// JsonDataExportDecorator.java
package com.bigboxcode.com.bigboxcode.decorator;
public class JsonDataExportDecorator extends DataExportDecorator {
public JsonDataExportDecorator(DataExport dataExporter) {
super(dataExporter);
}
@Override
public void processData() {
dataExporter.processData();
this.processJson();
}
private void processJson() {
System.out.println("Processed data to JSON");
}
}
Demo
// Main.java
package com.bigboxcode.com.bigboxcode.decorator;
public class Main {
public static void main(String[] args) {
DataExport csvDataExport = new CsvDataExportDecorator(new SimpleDataExport());
csvDataExport.processData();
DataExport excelDataExport = new ExcelDataExportDecorator(new SimpleDataExport());
excelDataExport.processData();
DataExport jsonDataExport = new JsonDataExportDecorator(new SimpleDataExport());
jsonDataExport.processData();
}
}
Output
The output of the demo above will be like below.
Processing Data
Processed data to CSV
Processing Data
Processed data to Excel
Processing Data
Processed data to JSON
Source Code
Use the following link to get the source code:
Example | Source Code Link |
---|---|
Example #1: Data Export | ![]() |