본문 바로가기
Design Pattern

[Design Pattern] 어댑터 패턴

by 진꿈청 2024. 3. 18.

이번에 다뤄볼 디자인 패턴은 어댑터 패턴이다.

어댑터 패턴을 사용해볼만한 경우는 크게 두 가지이다.

  1. 외부 요소를 기존 시스템에 재사용하고 싶지만 아직 만들어지지 않은 경우
  2. 외부 요소를 기존 시스템에 재사용하고 싶지만 호환되지 않은 경우

이렇게 두 경우에 사용할만하다.

 

또한, 레거시 코드에서도 활용이 가능하다.

 

코드와 함께 알아보자.

 

 

OuterTiger

// 예전에 만들어진 레거시 코드 or 외부에서 만든 라이브러리
// OuterTiger 코드를 수정하면 OCP 원칙 위반
public class OuterTiger {
    private String fullName = "호랑이";

    public String getFullName() {
        return fullName;
    }
}

 

OuterTiger라는 레거시 코드 또는 외부에서 만든 라이브러리가 있다고 가정하자.

우리는 해당 OuterTiger를 우리 프로젝트에서 사용을 해야 한다.

 

하지만, 이전 글에서 설명했듯 우리 문지기는 Animal이라는 추상적인 클래스에 대해 동작하도록 명령 받았다.

그러면 저 OuterTiger를 내쫒지 못한다.

 

그러면 해당 Animal 클래스를 상속받으면 되는거 아니냐 할 수 있다.

아래와 같은 방식으로 말이다.

// 예전에 만들어진 레거시 코드 or 외부에서 만든 라이브러리
// OuterTiger 코드를 수정하면 OCP 원칙 위반
public class OuterTiger extends Animal{
    private String fullName = "호랑이";

    public String getFullName() {
        return fullName;
    }

    @Override
    public String getName() {
        return null;
    }
}

 

하지만, 이는 OCP 원칙에 위배된다. OuterTiger 클래스를 수정했기 때문이다.

 

그렇기에 우리는 해당 OuterTiger를 사용할 수 있는 어댑터 클래스를 만들어줘야 한다.

 

 

TigerAdapter

public class TigerAdapter extends Animal{

    private OuterTiger outerTiger;

    public TigerAdapter(OuterTiger outerTiger) {
        this.outerTiger = outerTiger;
    }

    @Override
    public String getName() {
        return outerTiger.getFullName();
    }
}

 

우리는 위와 같은 어댑터 클래스를 사용함으로 OuterTiger와 같은 외부 라이브러리 또는 레거시 코드를 사용할 수 있다.

하지만, 위의 경우는 정확히 따지면 어댑터를 사용할 이유 중 아직 호환되지 않은 경우(2번)에 해당한다.

 

만약, 1번과 같이 외부 개발팀에서 아직 OuterTiger와 같은 클래스를 만들지 않았다면
우리는 FakeAdpater를 사용해서 개발작업을 이어가면 된다.(해당 클래스가 있다고 가정)

 

App

/**
 * 어뎁터 패턴
 * : 외부 요소를 기존 시스템에 재사용하고 싶지만 아직 만들어지지 않은 경우(FakeAdapter) -> OuterTiger가 아직 만들어지지 않음
 * : 외부 요소를 기존 시스템에 재사용하고 싶지만 호환되지 않은 경우
 */
public class App {
    public static void main(String[] args) {
        Mouse m = new Mouse();
        Cat c = new Cat();
        DoorMan dm = new DoorMan();
        TigerAdapter ta = new TigerAdapter(new OuterTiger());
        dm.쫓아내(m);
        dm.쫓아내(c);
        dm.쫓아내(ta);
    }
}

'Design Pattern' 카테고리의 다른 글

[Design Pattern] 탬플릿 메서드 패턴  (0) 2024.03.28
[Design Pattern] 싱글톤 패턴  (0) 2024.03.25
[Design Pattern] 프록시 패턴  (1) 2024.03.12
[Design Pattern] 전략 패턴  (1) 2024.03.12
SOLID란?  (3) 2024.03.11