Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / Java

Adapter Design Pattern in Java

4.89/5 (6 votes)
9 Oct 2012CPOL2 min read 30.2K   175  
CodeProjectReal life example: A very simple example is using phone charger.

Real Life Example

A very simple example is using phone charger. Suppose your mobile phone needs 9 Volts of supply to get charged but main supply is 220 V which is not what you require but it can be a source and you can have something that can get 9 V out of this 220 V and supply to your phone for charging. Now phone charger is acting as an adapter for you. So Basically it is making a relationship between two unrelated interfaces. This is how Adpater pattern works.

Intent

As described by Gof:

"Convert the interface of class into another interface clients expect.Adapter lets class work together that couldn't otherwise because of incompatible interfaces".

Also known as: Wrapper

UML Diagram of Generic Adapter Design Pattern

Elements

  • Target
    • defines domains-specific interface client uses.
  • Client
    • collaborates with objects conforming to target interface.
  • Adaptee
    • defines existing interface that needs adapting
  • Adapter 
    • adapts the interface of adaptee to target interface. 

WorkFlow

Clients call operations on the adapter instance. In turn adapter calls adaptee operations that carry out the request.

When to Use It

  • You want to use existing class and its interface does not match the one you need.
  • You want to create a resuable class that cooperates with unrelated or unforeseen classes that is, class that don't necessarily have compatible interfaces.

Example

UML Diagram for example

Comparing to above generic description of adapter pattern. My example includes following elements:

  • PrintableList(Target)
  • PrintString(Adaptee)
  • PrintableListAdapter(Adapter)

Java Code for all above classes:


Consider that we have a third party library that provides print string functionality through PrintString class.
This is our Adaptee. I know this is silly assumption but lets go with it for now.

PrintString.java(Adaptee) :

package org.arpit.javapostsforlearning.designpatterns;

public class PrintString {

	public void print(String s)
	{
		System.out.println(s);
	}
}

Client deals with ArrayList<String> but not with string.We have provided a PrintableList interface that expects the client input. This is our target.

PrintableList.java(Target)

Java
package org.arpit.javapostsforlearning.designpatterns;

import java.util.ArrayList;

public interface PrintableList {
	void printList(ArrayList<String> list);
}

Let's assume we can not change it now. Finally we have PrintableListAdapter class which will implement PrintableList interface and will deal with our adaptee class.

PrintableListAdapter.java(Adapter)

Java
package org.arpit.javapostsforlearning.designpatterns;

import java.util.ArrayList;

public class PrintableListAdapter implements PrintableList{

	public void printList(ArrayList<String> list) {
	
		//Converting ArrayList<String> to String so that we can pass String to
		// adaptee class
		String listString = "";

		for (String s : list)
		{
		    listString += s + "\t";
		}
		
		// instantiating adaptee class
		PrintString printString=new PrintString();
		ps.print(listString);
	}
}

AdapterDesignPatternMain.java

Java
package org.arpit.javapostsforlearning.designpatterns;

import java.util.ArrayList;
public class AdapterDesignPatternMain {
	
	public static void main(String[] args)
	{
		ArrayList<String> list=new  ArrayList<String>();
		list.add("one");
		list.add("two");
		list.add("three");
		PrintableList pl=new PrintableListAdapter();
		pl.printList(list);
		
	}
}

Output

one	two	three

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)