개발자이야기
디자인패턴 Adapter pattern 본문
Adapter pattern
어댑터 패턴이란?
용도는 비슷하게 사용되지만 서로 다른 interface를 구현한다면 같이 사용할 수 없다.
이러한 호환성 문제를 해결하기 위해 어댑터 패턴을 이용한다.
- 예시
우리는 모니터를 본체와 연결할때 dvi 케이블과 hdmi 케이블을 사용할 수 있다.
하지만 내 모니터는 hdmi만을 연결할 수 있고 나는 dvi 케이블만을 가지고있다.
이를 해결하기위해 dvi를 hdmi로 연결하기 위한 adapter가 필요하다.
코드를 한번 봅시다.
DVI
public interface Dvi {
void insertDviSlot();
void printScreen();
}
public class SamsungDvi implements Dvi {
@Override
public void insertDviSlot() {
System.out.println("insertDvi");
}
@Override
public void printScreen() {
System.out.println("printScreen");
}
}
HDMI
public interface Hdmi {
void insertHdmiSlot();
void printScreen();
}
public class LgHdmi implements Hdmi {
@Override
public void insertHdmiSlot() {
System.out.println("insertHdmi");
}
@Override
public void printScreen() {
System.out.println("printScreen");
}
}
현재 client는 가지고있는 Dvi interface를 구현한 dvi 케이블만 있습니다. 그렇기에 현재 client는 Hdmi가 필요한 모니터를 사용할 수 없는 상황입니다.
현재는 단순히 client가 Dvi interface에 의존하고 있으며 Hdmi를 사용할 수 없는 상황입니다.
Monitor
public class Monitor {
private Hdmi hdmi;
public Monitor(Hdmi hdmi) {
this.hdmi = hdmi;
}
public void printScreen() {
hdmi.printScreen();
}
}
우리가 연결해서 사용할 모니터 입니다. hdmi 케이블밖에는 지원하지 않습니다.
Adapter
public class DviAdapter implements Hdmi {
Dvi dvi;
public DviAdapter(Dvi dvi) {
this.dvi = dvi;
}
@Override
public void insertHdmiSlot() {
dvi.insertDviSlot();
}
@Override
public void printScreen() {
dvi.printScreen();
}
}
client가 필요한것은 Hdmi 케이블입니다. 우리는 Hdmi interface를 구현한 Adapter를 만들어주면 됩니다.
이젠 Hdmi 만을 지원하는 모니터를 사용할 준비가 끝났습니다.
Client
public class Client {
public static void main(String[] args) {
DviAdapter adapter = new DviAdapter(new SamsungDvi());
Monitor monitor = new Monitor(adapter);
monitor.printScreen();
}
}
client는 이제 dvi 케이블을 어댑터를 사용하여 moniter를 사용할 수 있게 되었습니다.
장점
- 사용하려는 코드를 수정하지 않고 달성하려는 목적의 interface에 호환되게 만들 수 있다.
- 기존 코드를 변경하지 않고 목적에 맞게 호환시킬 수 있기 때문에 재활용성에서 좋아진다.
단점
- 코드 복잡성 증가
- 구현하려는 목적의 interface의 내용을 모두 구현해야한다
'디자인패턴' 카테고리의 다른 글
의존성 주입(dependency injection) (0) | 2021.06.17 |
---|---|
추상팩토리 패턴 (Abstract-Factory Pattern) (0) | 2021.06.16 |
팩토리 메소드 패턴 (Factory method pattern) (0) | 2021.06.09 |
템플릿 메소드 (Template method) 패턴 (0) | 2021.06.09 |