Programming/Design Pattern

어댑터 패턴

부풍 2009. 9. 18. 14:55

1. 컨텍스트
특정 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 전환시킨다. 인터페이스가 호환되지 않아 상호 작용할 수 없는 경우에, Adapter를 이용하여 클래스 사이의 인터페이스의 호환성을 보장할 수 있다.
Adapter 패턴의 용도는 실생활에서 전기 플러그의 형태가 맞지 않은 경우에 어댑터(adapter)를 사용하는 것과 같은 이치라고 할 수 있다.

또한, 인터페이스를 맞추기 위하여 결과적으로 새로운 인터페이스로 클래스를 감싸게 되기 때문에 Wrapper 패턴이라고도 한다.

2. 적용 영역
■ 존재하는 클래스를 사용하고자 하는데 인터페이스가 부적절한 경우
■ 관계가 없거나, 예상하지 못하는 클래스와 함께 쓰일 수 있는 재사용 가능한 클래스를 생성하고자 하는 경우
■ Adapter는 클래스 수준의 Class Adapter와 객체 수준의 Object Adapter로 적용할 수 있다.
■ Object Adapter에서는 모든 하위 클래스의 인터페이스에 대해 Adapter를 적용하기 어렵다. 이러한 경우는 부모 클래스의 인터페이스에 Adapter를 적용한다.


4. 적용 결과
■ Class Adapter를 사용하는 경우는 Adaptee 클래스의 하위 클래스와 상호 작용할 수 없으나, Object Adapter를 사용하는 경우는 Adaptee 타입의 모든 객체와 상호 작용할 수 있다.
■ Class Adapter의 경우는 Adaptee의 하위 클래스이기 때문에 Adaptee 클래스의 행위를 재정의(overriding)할 수 있으나, Object Adapter의 경우는 별도로 Adaptee 클래스의 서브 클래스를 생성하고, Adapter에서 이러한 타입의 객체를 참조해야 하는 별도의 작업을 요하게 된다.
■ Class Adapter는 하나의 객체만으로 Adapter와 Adaptee 역할을 수행하게 되는 반면, Object Adapter는 adaptee 객체에 접근하기 위한 별도의 레퍼런스가 필요하다.

5. 관련 패턴
■ Bridge 패턴은 Object Adapter와 유사한 구조를 갖고 있지만, 서로 의도가 다르다. Adapter는 존재하고 있는 객체에 대한 인터페이스를 바꾸기 위한 의도를 갖지만, Bridge는 인터페이스를 해당 구현체(implementation)와 분리하기 위한 목적을 띈다.
■ Decorator 패턴은 인터페이스 변환 없이 다른 객체의 개선이 가능하다. 순수하게 Adapter 패턴만 적용해서는 순환 구성(recursive composition)이 불가능하고, Decorator를 이용하면 가능하다.
■ Proxy 패턴은 Adapter와 달리 인터페이스를 변환시키지 않고, 다른 객체에 대한 대리자 역할을 수행한다.

다음 URL에 Adapter 패턴을 이용한 RMI 통신 어플리케이션 설계 예제가 있다. 그 아래 URL은 Adapter 패턴의 작동 방식을 설명하는 아티클의 주소다.

http://www.javaworld.com/javaworld/jw-05-1999/jw-05-networked_p.html

http://www.javaworld.com/javaworld/jw-09-2003/jw-0926-designpatterns_p.html



- 이 종 화 (ingenuity.egloos.com) -