해당 밈을 모르는 사람은 여기를 참고하세요ㅎㅎ
아파트에서 강아지 짖는 소리가 계속 들려 한 남성이 화가 단단히 나 창문을 열고 소리질렀다. 야!! 개 짖는 소리 좀 안 나게하라!!!
그러자 잠시 후 남성의 집 초인종이 눌려 문을 열자 아뇨, 전 개가 아니라 고양인데요?
라고 강아지 처럼 생긴 고양이가 말을 했다.
이게 무슨 소리인가 싶겠지만, 어댑터 패턴을 사용하면 가능하다! (사실 아무말 대잔치 맞음)
어댑터 패턴에는 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()
가 존재하지 않지만 나머지 메소드가 비슷하다.
따라서 Eumeration
을 Iterator
로 변환해줄 수 있는 어댑터 패턴을 사용하여 클라이언트는 Iterator
라는 추상적인 반복자만 사용할 수 있게 된다.
즉, 어댑터 패턴은 서로 다른 두 인터페이스를 하나로 추상화하여 사용하는 것을 가능하게 해준다.
모든 소스코드는 여기에서 확인할 수 있다.