El patrón de diseño adapter es un de tipo interfaz y su implementación resuelve el problema de agregar una nueva implementación ha un código ya escrito.

El ejemplo más claro es cuando quiere cambiar un proveedor de servicios, imagina que tienes un contrato con la empresa X pero la empresa Y te da mejores beneficios, cambiar todo el desarrollo agregaría muchas horas de trabajo por lo cual generas una nueva interfaz y para heredar funcionalidad ya sea por clase o por objeto de la siguiente forma.

Tenemos la siguiente implementación que parecería normal en muchos lugares; una clase interfaz PayOne y su implementación en la clase PayOneImp.

public interface PayOne {
	public void methodOne();
}
public class PayOneImp implements PayOne {
	public void methodOne() {
		System.out.println("methodOne()");
	}
}
public class RunAdapterExample {
	public static void main(String[] args) {
		//-- First Implementation
		System.out.println("First Implementation");
		PayOne payOne = new  PayOneImp();
		payOne.methodOne();
	}
}

Implementación adapter

La implementación del adapter puede ser por clase o por objeto

Para empezar hay que agregar una nueva interfaz PayTwo

public interface PayTwo {
	public void methodOne_();
	public void methodTwo();
}

Implemetación por clase

En este tipo de implementación la clase hereda de PayOneImp e implementa la interfaz PayTwo

public class PayTwoImpAdapterByClass extends PayOneImp implements PayTwo {
	public void methodTwo() {
		System.out.println("methodTwo()");
	}
	public void methodOne_() {
		this.methodOne();
	}
}
public class RunAdapterExample {
	public static void main(String[] args) {
		//-- Implementation Adapter By Class
		System.out.println("Adapter Implementation by class");
		PayTwo payTwoByClass = new PayTwoImpAdapterByClass();
		payTwoByClass.methodOne_();
		payTwoByClass.methodTwo();
	}
}

Implementación por objeto

La implementación por objeto se instancia de la clase PayOneImp y se implementa de la interfaz PayTwo

public class PayTwoImpAdapterByObject implements PayTwo {
	private PayOne payOne;
	public PayTwoImpAdapterByObject(){
		this.payOne = new PayOneImp();
	}
	public void methodOne_() {
		this.payOne.methodOne();
	}
	public void methodTwo() {
		System.out.println("methodTwo()");
	}
}
public class RunAdapterExample {
	public static void main(String[] args) {
		//-- Implementation By Object
		System.out.println("Adapter Implementation by object");
		PayTwo payTwoByObject = new PayTwoImpAdapterByObject();
		payTwoByObject.methodOne_();
		payTwoByObject.methodTwo();
	}
}

Y de esta forma implementamos en dos formas el patrón Adapter