1. 어댑터 패턴이란?
어댑터 패턴(Adapter Pattern)은 서로 호환되지 않는 인터페이스를 가진 두 개의 클래스를 연결하기 위해 사용하는 구조적 디자인 패턴이다.
이 패턴을 통해 기존 클래스를 수정하지 않고도, 다른 클래스와 함께 동작하도록 할 수 있다. 즉, 어댑터는 하나의 인터페이스를 다른 인터페이스로 변환하여 호환되지 않는 클래스들이 함께 동작할 수 있게 하는것!
2. 어댑터 패턴의 주요 개념
- 타깃(Target) 인터페이스: 클라이언트가 사용하려고 하는 인터페이스. 예제에서는
Animal
클래스가 이에 해당함.
- 어댑티(Adaptee): 기존에 클라이언트가 사용하려는 인터페이스와 호환되지 않는 클래스. 예제에서는
OuterRabbit
클래스가 어댑티에 해당.
- 어댑터(Adapter): 타깃 인터페이스를 구현하고, 어댑티의 인터페이스를 타깃 인터페이스로 변환하는 클래스. 예제에서는
RabbitAdapter
가 어댑터 역할을 함.
- 클라이언트(Client): 타깃 인터페이스를 통해 어댑터를 사용하는 코드. 예제에서는
Doorman
클래스가 클라이언트.
3. 예제
먼저, 수정할 수 없는 외부 라이브러리의 클래스를 정의한다.
public class OuterRabbit {
private String fullname = "토끼";
public String getFullname() {
return fullname;
}
}
기존에
Animal
인터페이스를 구현한 클래스public abstract class Animal {
abstract String getName();
}
public class Mouse extends Animal {
private String name = "쥐";
public String getName() {
return name;
}
}
Doorman
클래스는 Animal
객체들을 받아 처리한다.public class Doorman {
public void getOut(Animal a){
System.out.println(a.getName()+" 저리가!");
}
}
그러나
OuterRabbit
클래스는 Animal
을 상속받지 않기 때문에,
Doorman
이 OuterRabbit
객체를 처리할 수 없다. 이 문제를 해결하기 위해 어댑터 패턴을 사용.
public class RabbitAdapter extends Animal {
private OuterRabbit rabbit;
public RabbitAdapter(OuterRabbit rabbit) {
this.rabbit = rabbit;
}
@Override
String getName() {
return rabbit.getFullname();
}
}
RabbitAdapter
는 Animal 과 is 관계가 아니지만 Rabbit 은 is 이기 때문에 상속을 받게된다.Aniaml
을 상속받게 됨에 따라 getName
을 오버라이드 하게 되고OuterRabbit
객체의 getFullname()
메서드를 호출한다.
이를 통해 OuterRabbit
객체가 Animal
객체처럼 동작할 수 있게 된다.
public class App {
public static void main(String[] args) {
Mouse m1 = new Mouse();
Doorman d1 = new Doorman();
d1.getOut(m1); // "쥐 저리가!" 출력
RabbitAdapter adapter = new RabbitAdapter(new OuterRabbit());
d1.getOut(adapter); // "토끼 저리가!" 출력
}
}
이를 통해
Doorman
은 토끼와 쥐를 내쫓을 수 있게 된다.Share article