어댑터 패턴

2020-02-11

어댑터 패턴

실생활에서 어댑터 패턴을 찾아볼 수 있는 사례는 휴대폰 충전기가 있습니다. 벽에 있는 콘센트(소켓)는 120V(미국에서) 를 만드는 반면에 휴대폰 배터리는 충전을 위해서 3V가 필요합니다. 이 때 휴대폰 충전기가 120V를 3V로 변압(?) 해주는 과정이 필요합니다.

첫번 째로 만들 클래스는 Volt 클래스 와 Socket 클래스 입니다.

예제 클래스

Volt.java

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;
	}
	
}

Socket.java

public class Socket {

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

Socket이 기본적으로 120볼트를 보내주지만, 휴대폰 충전하기 위해서는 3볼트로 변압을 해줘야합니다.

이제 3볼트와 12볼트 그리고 기본적으로 120볼트를 만드는 어댑터를 만들어 보겠습니다.

다음과 같이 어댑터 인터페이스를 만들어서 3개의 메소드가 있어야 합니다.

SocketAdapter.java

public interface SocketAdapter {

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

어댑터 패턴을 만드는 2가지 방법

  • Class Adapter : Socket 클래스를 상속해서 만드는 방법
  • Object Adapter : Composition 패턴을 이용해서 Socket 클래스를 포함시키는 방법

방법1 : Class Adapter

SocketClassAdapterImpl.class

// 방법 1
public class SocketClassAdapterImpl extends Socket implements SocketAdapter{

    @Override
    public Volt get120Volt() {
        return getVolt(); // 부모클래스의 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);
    }
}

방법2 : Object Adapter

SocketObjectAdapterImpl.class

public class SocketObjectAdapterImpl implements SocketAdapter{

    //Composition(구성) 패턴 사용
    private Socket socket = new Socket();

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

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

    @Override
    public Volt get3Volt() {
        Volt v = socket.getVolt();
        return convertVolt(v,40);
    }

    private Volt convertVolt(Volt v, int i) {
        return new Volt(v.getVolts()/i);
    }
}

테스트

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();
		}
	}
}

결과

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