Advanced Java September 20 ,2025

Composite Design Pattern in Java

Introduction

In many software systems, you need to represent part-whole hierarchies where clients treat individual objects and groups of objects uniformly. The Composite Pattern is a structural design pattern that allows this by composing objects into tree structures.

Think of it like a folder system on your computer: a folder can contain files or other folders, and the client can interact with both in the same way.

Definition

The Composite Pattern is a structural design pattern that lets you compose objects into tree structures and treat individual objects and compositions uniformly.

Key Idea: Use a common interface for both leaf objects (individual items) and composite objects (groups of items).

When to Use the Composite Pattern

  • When you need to represent hierarchical tree structures.
  • When clients should treat individual objects and groups uniformly.
  • When adding new types of components should not require changing client code.

Real-World Example

  • File System: Folders contain files or subfolders. Both support operations like display() or size().
  • Company Hierarchy: Departments contain employees or sub-departments, all supporting getSalary() or printDetails().

Java Implementation

Let’s implement a file system using the Composite Pattern:

Step 1: Define the Component Interface

import java.util.List;

interface FileSystem {
    void showDetails(); // Common operation for leaf and composite
}

Step 2: Create the Leaf Class

// Leaf class
class File implements FileSystem {
    private String name;

    public File(String name) {
        this.name = name;
    }

    @Override
    public void showDetails() {
        System.out.println("File: " + name);
    }
}

Step 3: Create the Composite Class

import java.util.ArrayList;
import java.util.List;

// Composite class
class Folder implements FileSystem {
    private String name;
    private List items = new ArrayList<>();

    public Folder(String name) {
        this.name = name;
    }

    public void add(FileSystem item) {
        items.add(item);
    }

    public void remove(FileSystem item) {
        items.remove(item);
    }

    @Override
    public void showDetails() {
        System.out.println("Folder: " + name);
        for (FileSystem item : items) {
            item.showDetails(); // Recursive call
        }
    }
}

Step 4: Test the Composite Pattern

public class Main {
    public static void main(String[] args) {
        File file1 = new File("Resume.docx");
        File file2 = new File("Photo.png");

        Folder folder1 = new Folder("My Documents");
        folder1.add(file1);
        folder1.add(file2);

        File file3 = new File("Presentation.pptx");
        Folder folder2 = new Folder("Work Documents");
        folder2.add(file3);
        folder2.add(folder1); // Nested folder

        folder2.showDetails();
    }
}

Output:

Folder: Work Documents
File: Presentation.pptx
Folder: My Documents
File: Resume.docx
File: Photo.png

Advantages of the Composite Pattern

  1. Simplifies Client Code: Clients interact with a single interface regardless of individual or composite objects.
  2. Hierarchy Representation: Ideal for tree-like structures.
  3. Flexibility: Easy to add new leaf or composite objects.
  4. Recursive Structure: Supports operations recursively over complex hierarchies.

Disadvantages

  1. Design Complexity: Can become complex for large systems with deep hierarchies.
  2. Type Safety: Clients may need to check object types if certain operations apply only to leaves.
  3. Overhead: Managing recursive calls and composite structures may incur performance overhead.

Summary

The Composite Pattern is a powerful structural pattern that treats individual objects and groups uniformly, making it ideal for hierarchical structures like file systems or organizational charts. By using a common interface, it simplifies client interactions and provides a flexible and scalable design.

Next, we will explore the Decorator Pattern, which allows dynamic addition of behavior to objects without modifying their structure.

 

Sanjiv
0

You must logged in to post comments.

Related Blogs

Generics P...
Advanced Java August 08 ,2025

Generics Part- 2

Collection...
Advanced Java July 07 ,2025

Collections Framewor...

Mastering...
Advanced Java August 08 ,2025

Mastering Java Multi...

Annotation...
Advanced Java August 08 ,2025

Annotations

Java Memor...
Advanced Java August 08 ,2025

Java Memory Manageme...

Java Lambd...
Advanced Java August 08 ,2025

Java Lambda Expressi...

Java Funct...
Advanced Java August 08 ,2025

Java Functional Inte...

Java Strea...
Advanced Java August 08 ,2025

Java Stream API

JDBC (Java...
Advanced Java August 08 ,2025

JDBC (Java Database...

JDBC (Java...
Advanced Java September 09 ,2025

JDBC (Java Database...

Annotation...
Advanced Java August 08 ,2025

Annotations

Generics
Advanced Java August 08 ,2025

Generics

Java I/O (...
Advanced Java August 08 ,2025

Java I/O (NIO)

Introducti...
Advanced Java September 09 ,2025

Introduction to Desi...

Design Pat...
Advanced Java September 09 ,2025

Design Patterns in J...

Other Prin...
Advanced Java September 09 ,2025

Other Principles Beh...

Creational...
Advanced Java September 09 ,2025

Creational Design Pa...

In Creatio...
Advanced Java September 09 ,2025

In Creational Design...

In Creatio...
Advanced Java September 09 ,2025

In Creational Design...

Creational...
Advanced Java September 09 ,2025

Creational Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

In Creatio...
Advanced Java September 09 ,2025

In Creational Design...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Builder De...
Advanced Java September 09 ,2025

Builder Design Patte...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Design Pat...
Advanced Java September 09 ,2025

Design Patterns in J...

Chain of R...
Advanced Java September 09 ,2025

Chain of Responsibil...

Command De...
Advanced Java September 09 ,2025

Command Design Patte...

Interprete...
Advanced Java September 09 ,2025

Interpreter Design P...

Iterator D...
Advanced Java September 09 ,2025

Iterator Design Patt...

Mediator D...
Advanced Java September 09 ,2025

Mediator Design Patt...

Memento De...
Advanced Java September 09 ,2025

Memento Design Patte...

Observer D...
Advanced Java September 09 ,2025

Observer Design Patt...

State Desi...
Advanced Java September 09 ,2025

State Design Pattern...

Strategy D...
Advanced Java September 09 ,2025

Strategy Design Patt...

Template M...
Advanced Java September 09 ,2025

Template Method Desi...

Visitor De...
Advanced Java September 09 ,2025

Visitor Design Patte...

Prototype...
Advanced Java September 09 ,2025

Prototype Design Pat...

Java 8+ Fe...
Advanced Java October 10 ,2025

Java 8+ Features

SOLID Prin...
Advanced Java October 10 ,2025

SOLID Principles in...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

How Iterat...
Advanced Java October 10 ,2025

How Iterators Work i...

How Concur...
Advanced Java October 10 ,2025

How ConcurrentHashMa...

Comparable...
Advanced Java October 10 ,2025

Comparable vs Compar...

Get In Touch

G06, Kristal Olivine Bellandur near Bangalore Central Mall, Bangalore Karnataka, 560103

+91-8076082435

techiefreak87@gmail.com