어텝터(adapter)
어뎁터패턴이란?
어뎁터페턴은 우리가 일상생활에서 사용하는 어뎁터와 비슷하다. 호환이 되지 않는 부분을 어뎁터를 통해 호환가능하게 만들어 주는것이다. 헤더퍼스트에서는 어댑터패턴을 이렇게 정의하고 있다. 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어뎁터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 사용할 수 있다.
말이 조금 어려운데 조금 쉽게 설명하자면 이럴 것 같다. 원래 사용 중인 인터페이스와 라이브러리가 있는데, 새로운 곳에서 사용하기 위해서는 지금의 라이브러리로는 사용하기 어렵다. 이때 어뎁터패턴을 이용하여 기존 기능을 최대한 살리면서 기능을 제공하는 것이다. 즉 코드의 재사용성을 높이는 의도로 볼 수 있다.
Adapter pattern UML
예시
Adapter pattern - Animal
Animal inferface를 상속받은 Tiger와 Lion은 걷기 / 소리를 낼 수 있는 기능이 있다.
기존 레거시코드에도 Cat/Dog 도 움직일 수 있고 소리를 내는 기능이 있는데 이를 하나의 인터페이스 즉 Animal을 이용해서 사용하려 한다. 이때 레거시인 Adaptee Class(Cat, Dog)에 Adapter 클래스를 랩핑 하여 하나의 인터페이스를 사용하여 코드의 재사용성을 높일 수 있다.
기존 레거시코드
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public void move() {
System.out.println(name + " : 고양이가 사뿐사분 이동합니다.");
}
public void bark(){
System.out.println(name + " : 냐용 웁니다.");
}
}
신규 인터페이스
public interface Animal {
void walk();
void sound();
}
신규인터페이스를 구현한 기능
public class Lion implements Animal{
private String name;
public Lion(String name) {
this.name = name;
}
@Override
public void walk() {
System.out.println(name + " : 사자가 성큼성큼 걷습니다.");
}
@Override
public void sound() {
System.out.println(name + " : 사자가 포효합니다.");
}
}
public class Tiger implements Animal{
private String name;
public Tiger(String name) {
this.name = name;
}
@Override
public void walk() {
System.out.println(name + " : 호랑이가 어슬렁 어슬렁");
}
@Override
public void sound() {
System.out.println(name + " : 호랑이가 어흥하고 소리를 냅니다.");
}
}
클라이언트
public class AdapterClientMain {
public static void main(String[] args) {
List <Animal> animalList =
List.of(
new Lion("포세이돈"),
new Tiger("산이"),
new CatAdapter(new Cat("뾰뿅"))
);
animalList.forEach(animal -> {
animal.walk();
animal.sound();
});
}
}
결과
포세이돈 : 사자가 성큼성큼 걷습니다.
포세이돈 : 사자가 포효합니다.
산이 : 호랑이가 어슬렁 어슬렁
산이 : 호랑이가 어흥하고 소리를 냅니다.
뾰뿅 : 고양이가 사뿐사분 이동합니다.
뾰뿅 : 냐용 웁니다.
기존 레거시 코드인 Cat 클레에 대해 Adapter를 붙여 인터페이스 하나로 사용 가능하게 하였다. 이처럼 기존 레거시코드를 새로운 인터페이스 맞춰서 기능을 제공해야 하거나, 코드의 재사용성을 높이고자 할 때 기존 라이브러리에 대한 기능을 인터페이스가 맞지 않는 곳에 제공해야 할때 어뎁터 패턴을 응용하면 좋을 것 같다.
'소프트웨어공학 > Design Pattern' 카테고리의 다른 글
플라이 웨이트 (flyweight pattern) (0) | 2023.01.27 |
---|---|
프록시 패턴(proxy) (0) | 2023.01.05 |
책임연쇠(chain-of-responsibility pattern) (0) | 2023.01.05 |
추상 팩토리 (abstract factory Pattern ) (2) | 2022.12.15 |
팩토리 메소드 패턴(Factory method pattern / Factory pattern) (0) | 2022.12.09 |