프로그램 아키텍쳐/디자인패턴

어댑터패턴 ( adapter pattern )

본클라쓰 2009. 1. 7. 12:12

 

 어댑터 패턴이란 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 사용할 수 있다. 인터페이스를 변화해 주는 어댑터를 만들어서 사용한다.

 

어댑터에는 두 종류가 있다. 하나는 객체 어댑터, 나머지는 클래스 어댑터이다.

 

 

 간단하게 다른 인터페이스를 상속받아 메소드를 구현한 Object_A, Object_B클래스를 어댑터로 연결하는 소스로 객체 어댑터에 대한 예시 코드이다.

 

[ A 클래스 계열 ]

public interface A {
    public void on();
    public void off();
}

 

[ A 클래스를 구현한 Object_A ]

public class Object_A implements A {
 
    public void on() {
        System.out.println("A를 on합니다.");
    }
 
    public void off() {
        System.out.println("A를 off합니다.");
    }
}

  

 [ B클래스 계열 ] 참고 - 인터페이스 구성도 안했으며 그냥 B클래스를 작성함 

public class Object_B {
 
    public void on() {
       System.out.println("B를 on합니다.");
    }
 
    public void off() {
        System.out.println("B를 off합니다.");
    }
}

  

[ 어댑터패턴 클래스 ] 

public class Adapter_B implements A {


    Object_B b;
 
    public Adapter_B(Object_B b){    /* 생성시 B객체를 전달 받는다. */
        this.b = b;
     }

 

/* A인터페이스 클래스를 제 구현하여 어댑터패턴을 완성

  * (메소드 구현은 A클래스에서 상속받아 구현)

  */
    public void on(){
        b.on();
    }
 

    public void off() {
        b.off();
    }
}

 

[ 어댑터 패턴을 사용한 시뮬레이터 클래스 ] 

public class Simulator {


    public static void main(String[] args) {


        Object_A a = new Object_A();
        Object_B b = new Object_B();
  
        A adapter_b = new Adapter_B(b);
  
         adapter_b.on();
         adapter_b.off();
    }
}

 

 간단한 소스 코드를 보면 객체 어댑터 패턴은 간단하다. 서로 다르게 구현한 것을 어느 한쪽으로 구현 패턴을 일치 시키는 것 뿐이 없기 때문이다.

  

 객체 어댑터와 클래스 어댑터는 서로 다른 방법을 사용한다. 객체 어댑터는 구성을 사용하고, 클래스 어댑터는 상속을 사용한다. 클래스 어댑터는 서브 클래스를 통한 구현이기 때문에 전체를 다시 구현하지 않아도 된다. 클래스 어댑터는 상속을 이용하므로 코드 분량을 줄일 수 있긴 하지만, 구성을 이용하더라도 어댑터한테 필요한 일을 시키기 위한 코드만 만들면 되기 때문에 별로 코드가 많이 필요하지는 않는다.