java adapter pattern (어뎁터 패턴)

2017-09-03

adapter pattern은 관계가 없는 인터페이스들이 같이 일할 수 있도록 도와주는 디자인 패턴이다. 이 두 인터페이스를 이어주는 인터페이스를 adapter라 부른다. 아래 예제를 보면서 이해해보도록하자.

volt class

public class Volt {
    private int volts;

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

    public int getVolts() {
        return this.volts;
    }

    public void setVolts(int volts) {
        this.volts = volts;
    }
}

socket class

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

adapter class

volt와 socket클래스를 만들었다. socket 클래스에서는 120v 만 얻을 수 있다. 실생활을 예로 들자면 120v로 부터 12v 와 3v도 얻고 싶다면 어탭터를 끼움으로 volt를 변환 할 수 있다. 마찬가지로 프로그래밍에서도 어뎁터 클래스를 통해서 원하는 volt를 얻을 수 있다. 아래와 같이 어뎁터 클래스를 작성한다.

public interface SocketAdapter {
    public Volt get120Volt();
    public Volt get12Volt();
    public Volt get3Volt();
}

이제 위의 어뎁터 클래스를 구현하는 클래스를 작성해보자. 어뎁터 클래스를 구현하는 방법은 2가지가 있다.

class adapter implementation

public class SocketClassAdapterImpl extends Socket implements SocketAdapter {
    public Volt get120Volt() {
        return getVolt();
    }

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

    public Volt get3Volt() {
        Volt v = getVolt();
        return convertVolt(v, 40);
    }

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

기본적으로 java에서는 다중 상속을 허용하지 않는다. extends와 implements를 동시에 사용함으로써 다중 상속을 흉내내었음에 주목하자. socket을 확장함으로써 socket의 메소드를 별도의 인스턴스 생성 없이 사용할 수 있다.

object adapter implementation

public class SocketObjectAdapterImpl implements SocketAdapter {

    private Socket sock = new Socket();

    public Volt get120Volt() {
        return sock.getVolt();
    }

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

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

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

}

두 번째 방법은 object adapter implementation이다. 위에서 사용되었던 extend 대신에 클래스 내부에서 socket인스턴스를 생성한 것이 가장 큰 차이점이다.

Tags :java

같은 카테고리의 다른 글

10년 묵은 jekyll 블로그를 astro로 옮기기

이 블로그는 2016년에 jekyll 로 만들었다. 그리고 10년 동안 글만 몇 개 올렸을 뿐, 블로그 자체에는 거의 손을 대지 않았다. 잘 돌아가는 것처럼 보였기 때문이다. 정적 사이트라 서버가 죽을 일도...

더보기

zsh, zplug과 oh-my-zsh 시작하기

최종 모습 zsh을 사용하게 된 계기 bash sh을 아주 잘쓰고 있었음 실수로 rm -rf 를 입력 혼돈의 카오스 닷으로 시작하는 설정 파일들이 날라감 (.bash 등등) 이렇게 된 이상 그 좋다던...

더보기

자바스크립트 화살표 함수 (array function)

array func 은 아래와 같은 간단한 형태를 보면 매우 간단하나, 복잡한 구문을 보면 매우 어렵게 느껴진다. 쉬운 array func 부터 복잡한 array func 까지 절차적으로 밟아보자. array func array func의...

더보기

java proxy pattern (프록시 패턴)

프록시는 실제로 액션을 취하는 객체를 대신해서 대리자 역할을 해준다. 프록시 패턴을 사용하게 되면 프록시 단계에서 권한을 부여할 수 있는 이점이 생기고 필요에 따라 객체를 생성시키거나 사용하기 때문에 메모리를 절약할 수...

더보기