한문장 정리
- 어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴입니다.
어댑터 패턴
- 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다.
- 어댑터를 이용하면 인터페이스
호환성
문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다
- 즉 서로 다른 두 인터페이스 사이에
통신
이 가능하게 하는 것이다.
- 전기 콘센트를 보면 이해가 쉽다.
- 한국의 표준 플러그를 일본에 전원 소켓에 바로끼워줄수 없어 동그랑 모양을 일자로 바꿔주는 어댑터를 끼워주어야 한다.
- 이와같이 어댑터는 소켓의 인터페이스를 플러그에서 필요로 하는 인터페이스로 바꿔준다고 할 수 있다.
- 동일하게 어떤 인터페이스를 클라이언트에서 요구하는 형태의 인터페이스에 적응시켜주는 역할을 한다.
예제
public interface Duck {
public void quack();
public void fly();
}
public class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("I'm flying");
}
}
public interface Turkey {
public void gobble();
public void fly();
}
public class WildTurkey implements **Turkey**{
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("I'm flying a short distance");
}
}
- Duck 객체가 모자라서 Turkey 객체를 대신 사용해야 하는 상황이라고 해보자.
- 인터페이스가 다르기 때문에 Turkey객체를 바로 사용할 수는 없다.
이제 어댑터를 만들어 보자.
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack(){
turkey.gobble();
}
@Override
public void fly() {
for(int i=0; i<5; i++) {
turkey.fly();
}
}
}
구조
- Client: 타깃 인터페이스를 사용하려는 쪽이다.
- Adaptee: 써드파티 라이브러리나 외부시스템을 의미한다.
- Target Interface:
- Adapter가 구현(implements) 하는 인터페이스이다.
- 클라이언트는 Target Interface 를 통해 Adaptee 인 써드파티 라이브러리를 사용하게 된다.
- Duck
- Adapter:
- Client 와 Adaptee 중간에서 호환성이 없는 둘을 연결시켜주는 역할을 담당한다.
- Target Interface 를 구현하며, 클라이언트는 Target Interface 를 통해 어댑터에 요청을 보낸다.
- 어댑터는 클라이언트의 요청을 Adaptee 가 이해할 수 있는 방법으로 전달하고, 처리는 Adaptee에게 위임
- 클라이언트에서 어댑터를 사용하는 방법.
- 클라이언트에서 타겟 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청을 한다.
- 어댑터에서는 어댑티 인터페이스를 사용하여 그 요청을 어댑티 에 대한 하나 이상의 메소드를 호출로 변환한다.
- 클라이언트에서는 호출 결과를 받긴 하지만 중간에 어댑터가 껴 있는지는 전혀 알지 못한다.
어댑터 패턴 호출 과정
구현의 두가지 방법
- 클래스 어댑터: 자바의 상속 이용
- 객체 어댑터: 자바의 합성 이용
장단비교
어댑터 패턴 정리
- Adaptee 를 감싸고, Target Interface 만을 클라이언트에게 드러낸다.
- Target Interface 를 구현하여 클라이언트가 예상하는 인터페이스가 되도록 Adaptee 의 인터페이스를 변경한다.
- Adaptee 가 기대하는 방식으로 클라이언트의 요청을 간접적으로 변경한다.
- 호환되지 않는 우리의 인터페이스와 Adaptee 를 함께 사용할 수 있다.
참고 출처