Tutorial

Adapter Design Pattern in Java

Published on August 3, 2022
author

Pankaj

Adapter Design Pattern in Java

Adapter design pattern is one of the structural design pattern and its used so that two unrelated interfaces can work together. The object that joins these unrelated interface is called an Adapter.

Adapter Design Pattern

adapter design pattern, adapter design pattern in java, adapter pattern, adapter pattern java example One of the great real life example of Adapter design pattern is mobile charger. Mobile battery needs 3 volts to charge but the normal socket produces either 120V (US) or 240V (India). So the mobile charger works as an adapter between mobile charging socket and the wall socket. We will try to implement multi-adapter using adapter design pattern in this tutorial. So first of all we will have two classes - Volt (to measure volts) and Socket (producing constant volts of 120V).

package com.journaldev.design.adapter;

public class Volt {

	private int volts;
	
	public Volt(int v){
		this.volts=v;
	}

	public int getVolts() {
		return volts;
	}

	public void setVolts(int volts) {
		this.volts = volts;
	}
	
}
package com.journaldev.design.adapter;

public class Socket {

	public Volt getVolt(){
		return new Volt(120);
	}
}

Now we want to build an adapter that can produce 3 volts, 12 volts and default 120 volts. So first of all we will create an adapter interface with these methods.

package com.journaldev.design.adapter;

public interface SocketAdapter {

	public Volt get120Volt();
		
	public Volt get12Volt();
	
	public Volt get3Volt();
}

Two Way Adapter Pattern

While implementing Adapter pattern, there are two approaches - class adapter and object adapter - however both these approaches produce same result.

  1. Class Adapter - This form uses java inheritance and extends the source interface, in our case Socket class.
  2. Object Adapter - This form uses Java Composition and adapter contains the source object.

Adapter Design Pattern - Class Adapter

Here is the class adapter approach implementation of our adapter.

package com.journaldev.design.adapter;

//Using inheritance for adapter pattern
public class SocketClassAdapterImpl extends Socket implements SocketAdapter{

	@Override
	public Volt get120Volt() {
		return getVolt();
	}

	@Override
	public Volt get12Volt() {
		Volt v= getVolt();
		return convertVolt(v,10);
	}

	@Override
	public Volt get3Volt() {
		Volt v= getVolt();
		return convertVolt(v,40);
	}
	
	private Volt convertVolt(Volt v, int i) {
		return new Volt(v.getVolts()/i);
	}

}

Adapter Design Pattern - Object Adapter Implementation

Here is the Object adapter implementation of our adapter.

package com.journaldev.design.adapter;

public class SocketObjectAdapterImpl implements SocketAdapter{

	//Using Composition for adapter pattern
	private Socket sock = new Socket();
	
	@Override
	public Volt get120Volt() {
		return sock.getVolt();
	}

	@Override
	public Volt get12Volt() {
		Volt v= sock.getVolt();
		return convertVolt(v,10);
	}

	@Override
	public Volt get3Volt() {
		Volt v= sock.getVolt();
		return convertVolt(v,40);
	}
	
	private Volt convertVolt(Volt v, int i) {
		return new Volt(v.getVolts()/i);
	}
}

Notice that both the adapter implementations are almost same and they implement the SocketAdapter interface. The adapter interface can also be an abstract class. Here is a test program to consume our adapter design pattern implementation.

package com.journaldev.design.test;

import com.journaldev.design.adapter.SocketAdapter;
import com.journaldev.design.adapter.SocketClassAdapterImpl;
import com.journaldev.design.adapter.SocketObjectAdapterImpl;
import com.journaldev.design.adapter.Volt;

public class AdapterPatternTest {

	public static void main(String[] args) {
		
		testClassAdapter();
		testObjectAdapter();
	}

	private static void testObjectAdapter() {
		SocketAdapter sockAdapter = new SocketObjectAdapterImpl();
		Volt v3 = getVolt(sockAdapter,3);
		Volt v12 = getVolt(sockAdapter,12);
		Volt v120 = getVolt(sockAdapter,120);
		System.out.println("v3 volts using Object Adapter="+v3.getVolts());
		System.out.println("v12 volts using Object Adapter="+v12.getVolts());
		System.out.println("v120 volts using Object Adapter="+v120.getVolts());
	}

	private static void testClassAdapter() {
		SocketAdapter sockAdapter = new SocketClassAdapterImpl();
		Volt v3 = getVolt(sockAdapter,3);
		Volt v12 = getVolt(sockAdapter,12);
		Volt v120 = getVolt(sockAdapter,120);
		System.out.println("v3 volts using Class Adapter="+v3.getVolts());
		System.out.println("v12 volts using Class Adapter="+v12.getVolts());
		System.out.println("v120 volts using Class Adapter="+v120.getVolts());
	}
	
	private static Volt getVolt(SocketAdapter sockAdapter, int i) {
		switch (i){
		case 3: return sockAdapter.get3Volt();
		case 12: return sockAdapter.get12Volt();
		case 120: return sockAdapter.get120Volt();
		default: return sockAdapter.get120Volt();
		}
	}
}

When we run above test program, we get following output.

v3 volts using Class Adapter=3
v12 volts using Class Adapter=12
v120 volts using Class Adapter=120
v3 volts using Object Adapter=3
v12 volts using Object Adapter=12
v120 volts using Object Adapter=120

Adapter Design Pattern Class Diagram

adapter pattern class diagram, adapter design pattern, adapter pattern, adapter design pattern in java

Adapter Design Pattern Example in JDK

Some of the adapter design pattern example I could easily find in JDK classes are;

  • java.util.Arrays#asList()
  • java.io.InputStreamReader(InputStream) (returns a Reader)
  • java.io.OutputStreamWriter(OutputStream) (returns a Writer)

That’s all for adapter design pattern in java.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar
Pankaj

author

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
April 14, 2014

Hi Pankaj, Very simple and clear example. Please provide some knowledge on test framework also like junit or testng.

- HIMANSU NAYAK

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    May 16, 2014

    Nice One. Pretty clear cut explanation. keep it on. Thanks, Manoj@ CITE

    - MANOJ @ CITE

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      November 13, 2014

      Hy Pankaj Kumar, thanks for your post, I have a question: reading Head first Design pattern, it seem in the Adapter design pattern get involved a bit od delegation, since all the requests made from the client using target interface, will be done delegating the job to the adaptee object. Actually I can’t see this in the Arrays.asList, because after all you’re creating a new object from using this method and not adapting array to respond to List interface using an adapter. It seems for me more reasonable and Adapter compliant in this manner: //ListAdapter.java public class ListAdapter implements List{ private String[] array; public ListAdapter(String[] array) { this.array=array; } @Override public int size() { return array.length; } /*Other methods*/ } // Test.java public static void main(String[] args) { String[] array = new String[2]; array[0]=“Giorgio”; array[1]=“Sara”; /* Versione artigianale del adapter tra array e list */ List list = new ListAdapter(array); System.out.println(list.size()); }

      - Giorgio

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        August 28, 2015

        Where are your two unrelated interfaces in these examples ?

        - Mahadev Shinde

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          September 6, 2016

          Good one but required more complex example.

          - JIten

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            October 11, 2016

            Hello Pankaj, could you please show us how does Object Adapter work ? i mean as Code in Java ? best regards Raed

            - Raed

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              June 7, 2017

              Keep in mind that with class adapter, you’re extending the adaptee (Socket.java in this case), which might pollute your API with undesirable methods/members of Socket.java and all of its parents, because you’re inheriting everything from Socket.java, giving the client more code than it needs/wants. This is important to keep in mind if you’re adapting a class that you don’t own from a 3rd party or something like that. Also, because the adapter is statically linked at compile time, you cannot adapt child classes of Socket.java. Object adapter is more flexible because you can adapt not only Socket.java, but all of its child classes as well.

              - Jose M Quijada

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                June 19, 2017

                What you have explained here, to some extent looks like strategy pattern. adapter pattern must be like below DestinationInterface adapt(SourceInterface si){ DestinationInterface di = new DestinationInterface (); //logic to convert / map SourceInterface to DestinationInterface return di; }

                - ravi

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  July 26, 2017

                  Hi, I love this tutorial. its really help me a lots to understanding. Thanks a lot

                  - Debi Boxi

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    September 13, 2017

                    Hi Pankaj, Your example was really good, it did help me understand the adapter pattern. I referenced your post while creating my demo for the same.

                    - Yogesh

                      Try DigitalOcean for free

                      Click below to sign up and get $200 of credit to try our products over 60 days!

                      Sign up

                      Join the Tech Talk
                      Success! Thank you! Please check your email for further details.

                      Please complete your information!

                      Become a contributor for community

                      Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                      DigitalOcean Documentation

                      Full documentation for every DigitalOcean product.

                      Resources for startups and SMBs

                      The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                      Get our newsletter

                      Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                      New accounts only. By submitting your email you agree to our Privacy Policy

                      The developer cloud

                      Scale up as you grow — whether you're running one virtual machine or ten thousand.

                      Get started for free

                      Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                      *This promotional offer applies to new accounts only.