어댑터 패턴

이주오·2021년 10월 12일
0

디자인 패턴

목록 보기
3/12
post-thumbnail

한문장 정리

  • 어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴입니다.

어댑터 패턴

  • 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다.
  • 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다
    • 즉 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것이다.
  • 전기 콘센트를 보면 이해가 쉽다.
    • 한국의 표준 플러그를 일본에 전원 소켓에 바로끼워줄수 없어 동그랑 모양을 일자로 바꿔주는 어댑터를 끼워주어야 한다.
    • 이와같이 어댑터는 소켓의 인터페이스를 플러그에서 필요로 하는 인터페이스로 바꿔준다고 할 수 있다.
    • 동일하게 어떤 인터페이스를 클라이언트에서 요구하는 형태의 인터페이스에 적응시켜주는 역할을 한다.

예제

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: 써드파티 라이브러리나 외부시스템을 의미한다.
    • Turkey
  • Target Interface:
    • Adapter가 구현(implements) 하는 인터페이스이다.
    • 클라이언트는 Target Interface 를 통해 Adaptee 인 써드파티 라이브러리를 사용하게 된다.
    • Duck
  • Adapter:
    • Client 와 Adaptee 중간에서 호환성이 없는 둘을 연결시켜주는 역할을 담당한다.
    • Target Interface 를 구현하며, 클라이언트는 Target Interface 를 통해 어댑터에 요청을 보낸다.
    • 어댑터는 클라이언트의 요청을 Adaptee 가 이해할 수 있는 방법으로 전달하고, 처리는 Adaptee에게 위임
  • 클라이언트에서 어댑터를 사용하는 방법.
    1. 클라이언트에서 타겟 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청을 한다.
    2. 어댑터에서는 어댑티 인터페이스를 사용하여 그 요청을 어댑티 에 대한 하나 이상의 메소드를 호출로 변환한다.
    3. 클라이언트에서는 호출 결과를 받긴 하지만 중간에 어댑터가 껴 있는지는 전혀 알지 못한다.

어댑터 패턴 호출 과정

구현의 두가지 방법

  • 클래스 어댑터: 자바의 상속 이용
  • 객체 어댑터: 자바의 합성 이용

장단비교

어댑터 패턴 정리

  • Adaptee 를 감싸고, Target Interface 만을 클라이언트에게 드러낸다.
  • Target Interface 를 구현하여 클라이언트가 예상하는 인터페이스가 되도록 Adaptee 의 인터페이스를  변경한다.
  • Adaptee 가 기대하는 방식으로 클라이언트의 요청을 간접적으로 변경한다.
  • 호환되지 않는 우리의 인터페이스와 Adaptee 를 함께 사용할 수 있다.

참고 출처

profile
동료들이 같이 일하고 싶어하는 백엔드 개발자가 되고자 합니다!

0개의 댓글