본문 바로가기

구조 디자인 패턴 - 어댑터 본문

OOP 디자인 패턴/구조패턴

구조 디자인 패턴 - 어댑터

개발자로 거듭나기 2023. 6. 10. 02:34
반응형

어댑터 패턴 (Adapter)

  • 어댑터는 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴입니다.
  • 어댑터는 한 객체의 인터페이스를 다른 객체가 이해할 수 있도록 변환하는 특별한 객체입니다.

어댑터 구성요소

  1. Target class (JsonFormat class) : 기본 비즈니스 로직의 인터페이스와 호환되는 형식을 정의합니다. (JSON 분석 프로그램이라고 가정합니다) → JSON 형식의 데이터와만 통신 가능
  2. Adaptee class : XML 형식의 데이터로써, 우리의 비즈니스 로직에 넣어서 처리할 수 없는 데이터 형식
  3. Adapter class : Adaptee 객체를 받아서 적절한 처리 후, 우리의 비즈니스 로직이 처리할 수 있도록 JSON 형식으로 변환해주는 클래스
  4. adapterClientCode : target을 인자로 받아서 request 메서드를 호출해서 적절한 동작(비즈니스 로직 이나 변환) 을 수행합니다.

요약

  • 어댑터 패턴은 한마디로 호환시켜주는 어댑터 클래스를 정의하는 패턴입니다.
  • 데이터 형식이나 사용방법 등이 맞지 않을 때, Adapter 클래스를 정의하고 적절한 처리를 통하여 우리가 원하는 형식이나 사용방법으로 변환시킵니다.
  • 클라이언트 코드에서는 단순히 request만 호출함으로써 다른 형식의 데이터도 편리하게 사용할 수 있습니다.

코드

/**
 * 우리는 타겟을 어댑터 클래스가 상속하게 하여서
 * 어댑터 클래스로 래핑되는 객체를 타겟형태로 만들어야 합니다.
 * 예를들어 Target = JSON 형식 / XML -> JSON 형식으로 바꾸는 adapter를 정의해야함
 */
class JsonFormat {
  public request(): string {
    return "기본적인 JSON 형식";
  }
}

/**
 * Adaptee는 어댑터의 적용을 받아 변환될 객체입니다.
 * XML to JSON
 */
class Adaptee {
  public specificRequest(): string {
    return "기본적인 XML 형식"; // reversed
  }
}

/**
 * 어댑터는 타겟(Json format)과 Adaptee(XML format)가 양립할 수 있게 만듭니다.
 */
class Adapter extends JsonFormat {
  private adaptee: Adaptee;

  constructor(adaptee: Adaptee) {
    super();
    this.adaptee = adaptee;
  }

  public request(): string {
    const result = this.adaptee.specificRequest().replace("XML", "JSON"); // XML -> JSON
    return `Adapter: (변환됨) ${result}`;
  }
}

/**
 * 클라이언트 코드는 타겟을 인자로 받아서 request 메서드를 호출합니다.
 */
function adapterClientCode(target: JsonFormat) {
  // 특정 도메인(기존 비즈니스 로직)
  console.log(target.request());
}

console.log("Client: 저는 JSON 형식의 객체와 통신할 수 있어요!");
const target = new JsonFormat();
adapterClientCode(target);

console.log("");

const adaptee = new Adaptee();
console.log("Client: 저는 XML 형식과는 통신할 수 없어요");
console.log(`Adaptee: ${adaptee.specificRequest()}`); // 어댑터 사용 전까지 Adaptee는 호환 불가

console.log("");

console.log(
  "Client: 하지만 저는 XML 형식이라도 어댑터를 통하면 통신할 수 있죠"
);
const adapter = new Adapter(adaptee); // 어댑터를 사용해서 Adaptee 호환
adapterClientCode(adapter);

결과

출처

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

반응형

'OOP 디자인 패턴 > 구조패턴' 카테고리의 다른 글

구조 디자인 패턴 - 복합체  (1) 2023.07.06
구조디자인 패턴 - 브리지  (0) 2023.06.27
Comments