Menu
Coddy logo textTech

어댑터 패턴

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 95번째.

Adapter patternincompatibleinterface들이 함께 작동할 수 있도록 합니다. 이는 그렇지 않으면 협력할 수 없는 두 class 사이에서 다리 역할을 하며, clients가 기대하는 새로운 interfaceexisting class를 감쌉니다. 이는 서드파티 라이브러리나 legacy 코드를 애플리케이션에 통합할 때 특히 유용합니다.

JSON 데이터와 함께 작동하는 시스템이 있지만 XML만 출력하는 구성 요소를 통합해야 한다고 상상해 보세요. 어느 클래스도 수정하는 대신, 두 클래스 사이를 변환하는 adapter를 만듭니다.

// 시스템이 기대하는 기존 인터페이스
abstract class JsonData {
  String getJson();
}

// 호환되지 않는 인터페이스를 가진 레거시 클래스
class XmlService {
  String getXml() {
    return '<data><name>John</name></data>';
  }
}

// Adapter가 XmlService를 JsonData와 호환되게 만듦
class XmlToJsonAdapter implements JsonData {
  final XmlService _xmlService;

  XmlToJsonAdapter(this._xmlService);

  @override
  String getJson() {
    String xml = _xmlService.getXml();
    // XML을 JSON으로 변환 (단순화)
    return '{"name": "John"}';
  }
}

void main() {
  var xmlService = XmlService();
  var adapter = XmlToJsonAdapter(xmlService);

  print(adapter.getJson());  // {"name": "John"}
}

XmlToJsonAdapterXmlService를 감싸고 JsonData 인터페이스를 구현합니다. 클라이언트 코드는 데이터가 원래 XML 소스에서 왔다는 사실을 알지 못한 채 익숙한 JsonData 인터페이스를 사용합니다. 어댑터가 모든 변환을 내부적으로 처리합니다.

기존 클래스를 사용하고 싶지만 해당 클래스의 인터페이스가 필요한 것과 일치하지 않을 때, 또는 호환되지 않는 인터페이스를 가진 클래스와 함께 작동하는 재사용 가능한 클래스를 만들어야 할 때 Adapter 패턴을 사용하세요.

challenge icon

챌린지

쉬움

미디어 플레이어 adapter 시스템을 만들어 봅시다! 모든 미디어 소스가 표준 interface를 통해 audio를 제공하기를 expects하는 현대적인 audio 시스템이 있지만, sound를 생성하는 방식이 완전히 다른 구식 vinyl record player를 통합해야 한다고 상상해 보세요.

adapter pattern 구현을 구성하기 위해 두 개의 파일을 만듭니다.

  • media_adapter.dart: 이 파일에는 interface와 adapter class가 포함됩니다. 현대적인 시스템이 expects하는 abstract class AudioSource를 Define합니다. 이 class에는 audio output을 문자열로 return하는 String playAudio() method가 있어야 합니다. 그런 다음 legacy equipment를 나타내는 VinylPlayer class를 만듭니다. 이 class에는 trackName field와 *crackle* Playing vinyl: [trackName] *crackle*을 return하는 String spinRecord() method가 있습니다. 마지막으로 AudioSource를 implements하고 VinylPlayer를 감싸는 VinylAdapter를 만듭니다. adapter의 playAudio() method는 vinyl player의 spinRecord() method를 Call하고 result를 return해야 합니다. 이렇게 incompatible한 interface를 연결합니다.
  • main.dart: media adapter 파일을 import하고, adapter가 현대적인 AudioSource interface를 expects하는 code와 함께 구식 vinyl player를 작동시키는 방식을 보여 줍니다. track name이 Bohemian RhapsodyVinylPlayer를 Create합니다. 그런 다음 이 vinyl player를 감싸는 VinylAdapter를 Create합니다. adapter를 AudioSource type의 variable에 저장하여 expected interface를 따른다는 것을 증명합니다. audio source에서 playAudio()를 Call하고 result를 print합니다.

이 pattern의 장점은 main code가 표준 AudioSource interface와 함께 작동한다는 것입니다. 내부에서 실제 작업을 old vinyl player가 수행하고 있다는 사실을 알 필요가 없습니다!

Expected output:

*crackle* Playing vinyl: Bohemian Rhapsody *crackle*

직접 해보기

import 'media_adapter.dart';

void main() {
  // TODO: 트랙 이름 "Bohemian Rhapsody"로 VinylPlayer를 생성하세요
  
  // TODO: vinyl player를 감싸는 VinylAdapter를 생성하세요
  
  // TODO: 어댑터를 AudioSource 타입의 변수에 저장하세요
  
  // TODO: audio source에서 playAudio()를 호출하고 결과를 출력하세요
  
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러