Adapter Pattern

The Adapter Pattern converts the interface of a class into another interface the clients expect. Adapter lets classes work together that coudn’t otherwise because of incompatible interfaces.

Adapter Pattern Diagram

Implementation

We have Duck Target interface:

public interface Duck {
	public void quack();
	public void fly();
}

Then, we have Adaptee interface

public interface Turkey {
	public void gobble();
	public void fly();
}

Target Concrete instance:

public class MallardDuck implements Duck {
	public void quack() {
		System.out.println("Quack);
	}
	
	public void fly() {
		System.out.println("I'm flying");
	}
}

Adaptee Concrete instnace:

public class WildTurkey implements Turkey {
	public void gobble() {
		System.out.println("Gobble");
	}
	
	public void fly() {
		System.out.println("I'm flying a short distance");
	}
}

Creating Adapter that adapts Adaptee instance to Target instance:

public class TurkeyAdapter implements Duck {
	Turkey turkey;
	
	public TurkeyAdapter(Turkey turkey) {
		this.turkey = turkey;
	}
 
	public void quack() { turkey.gobble() };
	
	public void fly() { 
		for (int i=0; i < 5; i++) {
			turkey.fly();
		}
	}
}

Testing:

public class DuckTestDrive {
	public static void main(String[] args) {
		Duck duck = new MallardDuck();
		
		Turkey turkey = new WileTurkey();
		Duck turkeyAdapter = new TurkeyAdapter(turkey);
		
		duck.quack();
		duck.fly();
		turkeyAdapter.quack();
		turkeyAdapter.fly();
	}
}

Real Example

public class EnumerationIterator implements Iterator<Object> {
 
	/* ? Generic type
	It can hold any of these:
		Enumeration<String>
		Enumeration<Integer>
		Enumeration<Object>
		Enumeration<SomeClass> */
	Enumeration<?> enumeration;
	
	public EnumerationIterator(Enumeration<?> enumeration) {
		this.enumeration = enumeration;
	}
	
	public boolean hasNext() {
		return enumeration.hasMoreElements();
	}
	
	public Object next() {
		return enumeration.nextElement();
	}
	
	public void remove() {
		throw new UnsupportedOperationException();
	}
 
}
public class EnumerationIteratorTestDrive {
 
	public static void main (String args[]) {
		
		Vector<String> v = new Vector<String>(Arrays.asList(args));
		/* Adapt Enumerator to Iterator */
		Iterator<?> iterator = new EnumerationIterator(v.elements());
		  		
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	
}