Advanced Java September 20 ,2025

Adapter Design Pattern in Java

Introduction

In real-world software development, you often encounter situations where two incompatible interfaces need to work together. The Adapter Pattern solves this problem by acting as a bridge between incompatible interfaces, allowing them to collaborate without changing existing code.

Think of it like an electrical plug adapter: your device has a plug type that doesn’t fit the socket, so you use an adapter to connect it safely and effectively. Similarly, the Adapter Pattern allows classes with incompatible interfaces to interact seamlessly.

Definition

The Adapter Pattern is a structural design pattern that allows objects with incompatible interfaces to work together. It wraps one object and provides a compatible interface to the client.

Key Idea: Convert the interface of a class into another interface that a client expects.

When to Use the Adapter Pattern

  • You have existing classes that cannot be modified.
  • You need compatibility between old and new interfaces.
  • You want to reuse a class but its interface does not match the client’s requirements.

Real-World Example

  • Mobile Charger: A charger has a USB-C connector, but the wall socket accepts a different type. The adapter converts the USB-C interface to the socket interface.
  • Legacy API Integration: Your system uses a modern payment interface, but the old payment gateway has a different API. An adapter bridges them.

Java Implementation

Let’s implement an Adapter Pattern for a media player scenario:

Step 1: Define the Target Interface

// Target interface expected by client
interface MediaPlayer {
    void play(String audioType, String fileName);
}

Step 2: Define the Adaptee (Existing Class)

// Existing class with incompatible interface
class AdvancedMediaPlayer {
    void playMp4(String fileName) {
        System.out.println("Playing MP4 file: " + fileName);
    }

    void playVlc(String fileName) {
        System.out.println("Playing VLC file: " + fileName);
    }
}

Step 3: Create the Adapter

// Adapter class to bridge MediaPlayer and AdvancedMediaPlayer
class MediaAdapter implements MediaPlayer {
    private AdvancedMediaPlayer advancedPlayer;

    public MediaAdapter(String audioType) {
        advancedPlayer = new AdvancedMediaPlayer();
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp4")) {
            advancedPlayer.playMp4(fileName);
        } else if (audioType.equalsIgnoreCase("vlc")) {
            advancedPlayer.playVlc(fileName);
        } else {
            System.out.println("Format not supported: " + audioType);
        }
    }
}

Step 4: Create the Client

// Client class using the MediaPlayer interface
class AudioPlayer implements MediaPlayer {
    private MediaAdapter adapter;

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing MP3 file: " + fileName);
        } else if (audioType.equalsIgnoreCase("mp4") || audioType.equalsIgnoreCase("vlc")) {
            adapter = new MediaAdapter(audioType);
            adapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid media format: " + audioType);
        }
    }
}

Step 5: Test the Implementation

public class Main {
    public static void main(String[] args) {
        AudioPlayer player = new AudioPlayer();

        player.play("mp3", "song1.mp3");   // Native format
        player.play("mp4", "video1.mp4");  // Adapter used
        player.play("vlc", "movie1.vlc");  // Adapter used
        player.play("avi", "clip1.avi");   // Unsupported format
    }
}

Output:

Playing MP3 file: song1.mp3
Playing MP4 file: video1.mp4
Playing VLC file: movie1.vlc
Invalid media format: avi

Advantages of Adapter Pattern

  1. Reusability: Allows existing classes to be reused without modification.
  2. Flexibility: Clients can work with multiple incompatible interfaces transparently.
  3. Separation of Concerns: Keeps adapter logic separate from client and adaptee classes.
  4. Scalability: New adapters can be added without changing client code.

Disadvantages

  1. Extra Layer: Introduces additional objects in the system, adding slight complexity.
  2. Overhead: Can become cumbersome if too many adapters are required.
  3. Limited Control: Adapter only converts interface; it doesn’t enhance underlying functionality.

Summary

The Adapter Pattern is an essential structural pattern in Java that bridges incompatible interfaces. It allows seamless integration of legacy systems, third-party libraries, or multiple APIs. By following this pattern, developers achieve flexibility, reusability, and maintainable code.

Next, we will explore the Bridge Pattern, which focuses on decoupling abstraction from implementation, allowing both to evolve independently.

 

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

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

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