어댑터 패턴(Adapter Pattern)

wannabeking·2022년 10월 12일
0

디자인 패턴

목록 보기
8/14
post-thumbnail

야 개 짖는 소리 좀 안 나게하라

해당 밈을 모르는 사람은 여기를 참고하세요ㅎㅎ

아파트에서 강아지 짖는 소리가 계속 들려 한 남성이 화가 단단히 나 창문을 열고 소리질렀다. 야!! 개 짖는 소리 좀 안 나게하라!!!

그러자 잠시 후 남성의 집 초인종이 눌려 문을 열자 아뇨, 전 개가 아니라 고양인데요?라고 강아지 처럼 생긴 고양이가 말을 했다.

이게 무슨 소리인가 싶겠지만, 어댑터 패턴을 사용하면 가능하다! (사실 아무말 대잔치 맞음)



어댑터 패턴

어댑터 패턴에는 Target, Adapter, Adaptee가 존재한다.

  • Target은 변경할 대상이 변경될 인터페이스이다.
  • Adapter은 Adaptee를 필드로 가지고 Target을 구현하여 연결해주는 역할을 수행하는 클래스이다.
  • Adaptee는 변경할 대상이다.

Target 부터 살펴보자.


public interface Cat {

    void meow();
}
public class KoreanShortHairCat implements Cat {

    @Override
    public void meow() {
        System.out.println("나는 코숏이다옹~");
    }
}
public interface Dog {

    void bark();
}
public class MalteseDog implements Dog {

    @Override
    public void bark() {
        System.out.println("나는 말티즈다 멍!");
    }
}

우리는 강아지를 고양이로 변신시킬 것이므로 Cat은 Target, Dog는 Adaptee에 해당된다.

고양이는 meow(), 강아지는 bark()로 다르지만 비슷한 메소드를 가진다.


public class DogAdapter implements Cat {

    private Dog dog;

    public DogAdapter(Dog dog) {
        this.dog = dog;
    }

    @Override
    public void meow() {
        dog.bark();
    }
}

대망의 Adapter!

필드에 Adaptee를 가져 Target을 구현할 때 bark()meow()로 바꿔치기 해준다.

그럼 이제 psvm에서 개 같은(욕 아님) 고양이를 살펴보자.


public class Main {

    public static void main(String[] args) {
        Cat koreanShortHairCat = new KoreanShortHairCat();
        Cat malteseDog = new DogAdapter(new MalteseDog());

        koreanShortHairCat.meow();
        malteseDog.meow();
    }
}

말티즈를 DogAdater를 통해 고양이로 만들어 주었다.

출력 결과는 다음과 같다.


Java에는 초기 컬렉션에서 Iterator 대신 Enumeration을 썼고, 후자에는 remove()가 존재하지 않지만 나머지 메소드가 비슷하다.

따라서 EumerationIterator로 변환해줄 수 있는 어댑터 패턴을 사용하여 클라이언트는 Iterator라는 추상적인 반복자만 사용할 수 있게 된다.

즉, 어댑터 패턴은 서로 다른 두 인터페이스를 하나로 추상화하여 사용하는 것을 가능하게 해준다.


모든 소스코드는 여기에서 확인할 수 있다.



profile
내일은 개발왕 😎

0개의 댓글