구조 패턴은 클래스와 객체를 조합하는 방식을 정형화한 패턴이다.
그중 Adapter Pattern은 이미 구축되어 있는 것을 새로운 어떤 것에 사용할 때 양쪽 간의 호환성을 유지해 주기 위해 사용한다.
기존 클래스를 수정하지 않고도, 특정 인터페이스를 필요로 하는 코드에서 사용할 수 있다.
어댑터 패턴은 타겟(Target), 어댑티(Adaptee), 어댑터(Adapter), 클라이언트(Client)로 구성되며 각 요소의 개념은 아래와 같다.
타겟(Target): 클라이언트가 직접적으로 사용하기 위해 호출하는 인터페이스이다.
어댑티(Adaptee): 클라이언트가 사용하고 싶어 하는, 아직 호환되지 않은 인터페이스를 가진 실제 객체
어댑터(Adapter): 타겟 인터페이스를 구현하며, 어댑티의 인터페이스를 타겟 인터페이스로 변환하는 역할을 하는 클래스이다.
클라이언트(Client): 특정 작업을 요청하는 클래스이며, 타겟 인터페이스를 통해 어댑티를 사용하려는 객체이다.
// Target 인터페이스
interface USB {
void connectWithUsbCable();
}
- Target 인터페이스
USB
- 클라이언트에서 사용하려는 메서드
connectWithUsbCable를 정의한다.
//실제 사용하려는 어댑티 클래스
class HDMI {
public void connectWithHdmiCable() {
System.out.println("Connected with HDMI cable");
}
}
- Adaptee 클래스
HDMI
- 기존 클래스이며, HDMI 인터페이스로 연결하는 메서드
connectWithHdmiCable를 가지고 있다.
class HDMItoUSBAdapter implements USB {
private HDMI hdmiDevice;
public HDMItoUSBAdapter(HDMI hdmiDevice) {
this.hdmiDevice = hdmiDevice;
}
@Override
public void connectWithUsbCable() {
hdmiDevice.connectWithHdmiCable();
}
}
- Adapter 클래스
HDMItoUSBAdapter
USB인터페이스를 구현하며,HDMI객체를 포함한다.connectWithUsbCable메서드에서HDMI객체의connectWithHdmiCable메서드를 호출한다.
class Computer {
private USB usbDevice;
public Computer(USB usbDevice) {
this.usbDevice = usbDevice;
}
public void connect() {
usbDevice.connectWithUsbCable();
}
public static void main(String[] args) {
HDMI hdmiDevice = new HDMI();
USB adapter = new HDMItoUSBAdapter(hdmiDevice);
Computer computer = new Computer(adapter);
computer.connect(); // Output: Connected with HDMI cable
}
}
- Client 클래스
Computer
USB인터페이스를 사용하여 어댑터를 통해 HDMI 장치를 연결한다.- 메인 메서드에서
HDMI객체와HDMItoUSBAdapter객체를 생성하여 어댑터를 통해HDMI장치를 연결한다.
https://refactoring.guru/ko/design-patterns/adapter
https://yozm.wishket.com/magazine/detail/2077/