구조 디자인 패턴 - 어댑터 본문
반응형
어댑터 패턴 (Adapter)
- 어댑터는 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴입니다.
- 어댑터는 한 객체의 인터페이스를 다른 객체가 이해할 수 있도록 변환하는 특별한 객체입니다.
어댑터 구성요소
- Target class (JsonFormat class) : 기본 비즈니스 로직의 인터페이스와 호환되는 형식을 정의합니다. (JSON 분석 프로그램이라고 가정합니다) → JSON 형식의 데이터와만 통신 가능
- Adaptee class : XML 형식의 데이터로써, 우리의 비즈니스 로직에 넣어서 처리할 수 없는 데이터 형식
- Adapter class : Adaptee 객체를 받아서 적절한 처리 후, 우리의 비즈니스 로직이 처리할 수 있도록 JSON 형식으로 변환해주는 클래스
- 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);
결과
출처
반응형
'OOP 디자인 패턴 > 구조패턴' 카테고리의 다른 글
구조 디자인 패턴 - 복합체 (1) | 2023.07.06 |
---|---|
구조디자인 패턴 - 브리지 (0) | 2023.06.27 |
Comments