어댑터(Adapter)

Seo·2020년 8월 26일
0

design_pattern

목록 보기
8/11

상위문서: GoF 디자인 패턴

어댑터(Adapter)

  • 상위 Category : 구조(Structural) 패턴

어댑터 패턴은 이름대로 어댑터처럼 사용되는 패턴이다.

콘센트 규격이 다른 나라에 여행을 가거나 방문을 하면 꼭 사용해야 되는 것이 어댑터이다. 어댑터를 사용하면 110V 를 쓰는곳에 가서도 그대로 쓸 수 있다. 이처럼, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해주는 패턴이 어댑터 패턴이라고 할 수 있겠다. 이를 위해 어댑터 역할을 하는 클래스를 새로 만들어야 한다.

  • 관계가 없는 인터페이스 간 같이 사용 가능
  • 프로그램 검사 용이
  • 클래스 재활용성

기존 클래스의 명세(사양)을 바꾸지 않고 새로운 클래스를 작성해서 관리하는 방법을 쓸 때 사용하기도 한다.

어댑터패턴

위 그림과 같이 구현방식은 Adapter class를 통해 관계가 없는 인터페이스들이 연계되서 사용될 수 있도록 한다.

public interface Plugin {
    public void connect();
    public void disconnect();
}

public class Plugin110V implements Plugin {
    @Override
    public void connect() {
        System.out.println("110V connect");
    }
    @Override
    public void disconnect() {
        System.out.println("110V disconnect");
    }
}

현재는 110v만 얻을 수 있다.
그런데 220v를 사용하려고 하는데 어떻게 해야 되는가?

먼저 adapter class를 만든다.

public interface PluginAdapter {
    public void connect();
    public void disconnect();
}

실제로 interface를 구현할 때는 2가지 방식으로 사용할 수 있다.

  • object adapter implementation
  • class adpater implementation

차이는 참조할 class를 상속받아 사용하느냐 직접 인스턴스를 선언해서 사용하느냐 이다.

주로 사용되는 object adpater implementation을 살펴본다.

//object adpater implementation
public class Adapter220V implements PluginAdapter {
    private Plugin plugin;
	
    public Adapter220V(Plugin plugin) {
        this.plugin=plugin;
    }
    
    @Override
    public void connect() {
        System.out.println("220V->110V convert");
        this.plugin.connect();
    }
    @Override
    public void disconnect() {
        System.out.println("220V->110V convert");
        this.plugin.disconnect();
    }
}

//main
public class AdapterMain {
    public static void main(String[] args) {
        PluginAdapter plugin = new Adapter220V(new Plugin110V());
        plugin.connect();
        plugin.disconnect();
    }
}
//result
//220V->110V convert
//110V connect
//220V->110V convert
//110V disconnect
profile
개발관심자

0개의 댓글