Adapter Pattern

Lee Luda·2024년 7월 3일
3

DesignPattern

목록 보기
2/2

Adapter Pattern

구조 패턴은 클래스와 객체를 조합하는 방식을 정형화한 패턴이다.
그중 Adapter Pattern은 이미 구축되어 있는 것을 새로운 어떤 것에 사용할 때 양쪽 간의 호환성을 유지해 주기 위해 사용한다.

기존 클래스를 수정하지 않고도, 특정 인터페이스를 필요로 하는 코드에서 사용할 수 있다.


주요 개념

어댑터 패턴은 타겟(Target), 어댑티(Adaptee), 어댑터(Adapter), 클라이언트(Client)로 구성되며 각 요소의 개념은 아래와 같다.

타겟(Target): 클라이언트가 직접적으로 사용하기 위해 호출하는 인터페이스이다.

어댑티(Adaptee): 클라이언트가 사용하고 싶어 하는, 아직 호환되지 않은 인터페이스를 가진 실제 객체

어댑터(Adapter): 타겟 인터페이스를 구현하며, 어댑티의 인터페이스를 타겟 인터페이스로 변환하는 역할을 하는 클래스이다.

클라이언트(Client): 특정 작업을 요청하는 클래스이며, 타겟 인터페이스를 통해 어댑티를 사용하려는 객체이다.


구현 방법

  1. 패턴을 적용하고자 하는 인터페이스 식별
  2. 어댑터 클래스 작성
  3. 클라이언트 코드에서 호출

구현 예시

1. 패턴을 적용하고자 하는 인터페이스 식별

// Target 인터페이스
interface USB {
    void connectWithUsbCable();
}
  • Target 인터페이스 USB
    • 클라이언트에서 사용하려는 메서드 connectWithUsbCable 를 정의한다.
//실제 사용하려는 어댑티 클래스
class HDMI {
    public void connectWithHdmiCable() {
        System.out.println("Connected with HDMI cable");
    }
}
  • Adaptee 클래스 HDMI
    • 기존 클래스이며, HDMI 인터페이스로 연결하는 메서드 connectWithHdmiCable 를 가지고 있다.

2. 어댑터 클래스 작성

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 메서드를 호출한다.

3. 클라이언트 코드에서 호출

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 장치를 연결한다.

장점과 단점

장점

  • 기존의 클래스를 수정하지 않고도 클라이언트에서 새로운 인터페이스를 사용 가능하다.
  • 기본 비즈니스 로직에서 인터페이스 또는 데이터 변환 코드를 분리할 수 있기 때문에 단일 책임 원칙을 만족한다.
  • 기존 클래스 코드를 건드리지 않고 클라이언트 인터페이스를 통해 어댑터와 작동하기 때문에 개방 폐쇄 원칙 만족한다.
  • 클래스 간의 결합도를 줄여 소스 코드 변경에 용이하다.

단점

  • 어댑터 클래스를 추가로 작성해야 해서 소스코드가 늘어난다.
  • 어댑터 중간에 데이터를 변환하는 과정에서 추가적인 처리 시간과 오버헤드의 발생 가능성이 높아진다.

Reference

https://refactoring.guru/ko/design-patterns/adapter

https://yozm.wishket.com/magazine/detail/2077/

https://inpa.tistory.com/entry/GOF-💠-어댑터Adaptor-패턴-제대로-배워보자

https://jusungpark.tistory.com/22

profile
To Luda

0개의 댓글