본문 바로가기

객체지향 디자인 패턴

어댑터 패턴

어댑터 패턴이란 매우 간단한 패턴이다. 기존에 있는(adaptee)것을 클라이언트 자신이 원하는 방식으로 사용해 주기 위해서 자신이 원하는 방식을 인터페이스로 만들어주고 새로운 클래스를 하나 만들어 그 클래스가 자신이 원하는 인터페이스를 implement해주고 기존에 있는 것을 has-a로 넣어 주는 것이 어댑터 패턴이다.

클라이언트가 adaptee(A)를 자기가 원하는 B타입으로 사용할 수 있게 해주는 것입니다. 여기서 이미 제공되어 있는것(A)의 메서드 이름과 매개변수가 필요한 것(B)의 그것과 다를 수 있다. 이 다른것을 맞추어 주기 위해  어댑터 패턴을 쓰는 것임. 

 

아… 이제 이해가 간다. 이미 있는 것을 자신이 원하는 방식대로 쓸 수 있게 해주기 위해서 자신이 원하는 방식을 인터페이스로 여기고 구현하는 것(implements)이고 이미 있는 것을 내가 원하는 대로 쓸수 있어야 하기 때문에 이미 있는 것을 has-a관계로 두고 원하는 방식을 구현할 때 그 기존에 있는 것의 함수로 구현하는 것이다!!!(나누어준 예제보면 바로 이해함)

/**
 * 플러그 가능 어댑터: 객체 어댑터
 * 서로 다른 이름으로 정의된 메소드를 모두 foo 이름을 통해 호출하고자 함
 * Cat::meow, Dog::bark, Frog::croak 
 * 실제 어댑티를 유지하는 것이 아님. 
 * 특정 객체의 특정 메소드를 호출하는 메소드를 유지함
 */
public class Adapter implements Target{
   private Target target;
   public Adapter(Target target) {
      this.target = target;
   }
   @Override
   public void foo() {
      target.foo();
   }
}

/*
클라이언트가 adaptee클래스를 자신이 원하는 인터페이스를 이용하여 사용할 수 있게끔 해줌. (단, 클라이언트와 adaptee에는 변형을 가해주지 않음.)

 */