흔히 사용하는 어댑터와 같은 역할을 하는 객체 입니다. 플랫폼에 독립적으로 클라이언트들이 사용하는 인터페이스에 맞춰 사용할 수 있도록 해줍니다.

1067386489.bmp
기존 시스템에서 사용하던 소스코드는 그대로 두고 새로운 클래스의 메소드를 사용하고 싶다면 기존 시스템에서 사용하던 인터페이스를 구현하는 클래스를 만들면서 구현 할 때 사용하고 싶은 클래스의 인터페이스를 호출하면 됩니다. 그런 클래스를 어댑터라고 합니다.

1342364516.bmp이렇게하면 기존 시스템에서 사용하던 코드는 변경할 필요가 없이 기능이 확장될 수 있습니다. 이 그림은 Java를 처음 배울 때 자바의 특성중에 '플랫폼에 독립적이다.'라는 말이 나올때 마다 봤던 그림을 떠올리게 합니다. JVM자체는 플랫폼에 종속적이지만 JVM 위에서 실행되는 클래스들은 JVM 덕분에 리눅스든 윈도우든 맥이든 어디서든 돌아가게 되있다는 것이였죠.

책에서 예를 들고 있는 Duck interface를 보겠습니다.

기존 시스템에서 사용하던 인터페이스에 해당하는 Duck 인터페이스 소스보기
[#M_ more.. | less.. |
public interface Duck {
   public void quack();
   public void fly();
}
_M#]
사용하고 싶은 클래스에 해당하는 인터페이스인 Turkey 인터페이스 소스보기
[#M_ more.. | less.. |
public interface Turkey {
   public void gobble();
   public void fly();
}
_M#]
이 둘을 연결해주는 어댑터에 해당하는 TurkeyAdapter 클래입니다.
[#M_ more.. | less.. |
public class TurkeyAdapter implements Duck {
   Turkey turkey;

   public TurkeyAdapter(Turkey turkey) {
       this.turkey = turkey;
   }

   public void quack() {
       turkey.gobble();
   }

   public void fly() {
       for(int i=0; i < 5; i++) {
           turkey.fly();
       }
   }
}
_M#]

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

핵심이라고 생각하는 부분은 클래이언트는 바뀔 필요가 없는데 나중에 다른 구현을 추가할 수 있다는 것 같습니다. 즉 OCP가 적용되어 있는 패턴이라는 것이죠. 이런 어댑터 패턴은 크게 두 가지로 나뉘는데 하나는 객체 어댑터 패턴 다른 하나는 클래스 어댑터 패턴입니다.

먼저 객체 어댑터 패턴의 정의와 그 클래스 다이어그램 입니다.
The Object Adapter pattern- In this type of adapter pattern, the adapter contains an instance ofthe class it wraps. In this situation, the adapter makes calls to aphysical instance of the wrapped object.

감싸주는 클래스의 객체를 만들어서 호출하기 때문에 객체 어댑터 패턴이라고 합니다. Composition을 사용하여 확장이 편리하도록 했습니다.

다음은 클래스 어댑터 패턴의 정의와 클래스 다이어그램입니다.
The Class Adapter pattern - This type of adapter uses multiple inheritanceto achieve its goal. The adapter is created inheriting interfaces fromboth the interface that is expected and the interface that ispre-existing. The Object Adapter pattern is more often used as somepopular languages, such as Java, do not support true multiple inheritance as the designers of these languages consider it a dangerous practice.