어댑터 패턴 (Adapter Pattern)

작성일2020-06-12

구성요소

  • Target: 어댑터 패턴을 사용하기 위한 인터페이스를 정의한다.
  • Adapter: Target 인터페이스를 구현하여 기존의 클래스를 사용할 수 있도록 한다.
  • Adaptee: 어댑터 패턴을 사용하기 위한 기존의 클래스이다.
  • Client: Adapter 패턴을 사용하는 클래스이다.

예제

먼저 Adapter 패턴을 사용하기 위해 선언한 핵심 구성요소는 아래와 같은 클래스들로 구성된다.

상황

기존에 사용하던 결제 시스템이 있다고 가정하자. 이 결제 시스템은 Payment 인터페이스를 구현하고 있다. 하지만, 새로운 결제수단으로 PayPal을 사용하고자 한다. PayPal은 PayPalAPI 클래스를 사용하여 결제를 처리한다. 이를 위해 추가적인 코드의 작성이 필요한 상황이다.

구성요소 정의

public interface Payment {

    void processPayment(double amount);

    PaymentStatus checkStatus(String paymentId);
}

위의 코드로 어댑터 패턴의 핵심 구성요소를 설명하면 다음과 같다.

  • Target: Payment.java
  • Adapter: PaypalAdapter.java
  • Adaptee: PayPalAPI.java
  • Client: PaymentProcessor.java

그리고 예시를 위해 추가적인 데이터가 아래와 같이 있다고 가정 한다.

//페이팔 결제 요청정보
public class PayPalPaymentRequest {

    private final double amount;

    public PayPalPaymentRequest(double amount) {
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }
}

위 정보를 조합하면 각 클래스간 역할 및 관계는 다음과 같다.

Diagram Loading...

Adapter 패턴의 사용으로 새로운 결제수단이 추가되어도 기존의 결제처리 로직을 변경하지 않고 사용할 수 있다.

  • PayPalAdapter는 Payment 인터페이스를 구현하여 내부적으로 PayPalAPI를 사용하며, 기존 결제에 대한 행동에는 변화가 없다.
  • Payment 역할을 그대로 수행하며 내부적으로 실제 처리과정만 다를 뿐이다.

사용

Order order = new Order(100.0);

PaymentProcessor processor = LocalDate.now().isBefore(LocalDate.of(2021, 4, 13))
        ? new PaymentProcessor(new LegacyPayment())
        : new PaymentProcessor(new PaypalAdapter(new PayPalAPI()));

processor.process(order);
예를들어 2021-04-13 부터 PayPal 결제로만 서비스를 제공한다고 가정하면, 위와 같이 사용할 수 있다.

Copyright © 2019-2025 Alloc · MIT License