Design Pattern: Decorator Pattern in Java

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:

Leave a Comment