어댑터 패턴
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 95번째.
Adapter pattern은 incompatible한 interface들이 함께 작동할 수 있도록 합니다. 이는 그렇지 않으면 협력할 수 없는 두 class 사이에서 다리 역할을 하며, clients가 기대하는 새로운 interface로 existing 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"}
}XmlToJsonAdapter는 XmlService를 감싸고 JsonData 인터페이스를 구현합니다. 클라이언트 코드는 데이터가 원래 XML 소스에서 왔다는 사실을 알지 못한 채 익숙한 JsonData 인터페이스를 사용합니다. 어댑터가 모든 변환을 내부적으로 처리합니다.
기존 클래스를 사용하고 싶지만 해당 클래스의 인터페이스가 필요한 것과 일치하지 않을 때, 또는 호환되지 않는 인터페이스를 가진 클래스와 함께 작동하는 재사용 가능한 클래스를 만들어야 할 때 Adapter 패턴을 사용하세요.
챌린지
쉬움미디어 플레이어 adapter 시스템을 만들어 봅시다! 모든 미디어 소스가 표준 interface를 통해 audio를 제공하기를 expects하는 현대적인 audio 시스템이 있지만, sound를 생성하는 방식이 완전히 다른 구식 vinyl record player를 통합해야 한다고 상상해 보세요.
adapter pattern 구현을 구성하기 위해 두 개의 파일을 만듭니다.
media_adapter.dart: 이 파일에는 interface와 adapter class가 포함됩니다. 현대적인 시스템이 expects하는 abstract classAudioSource를 Define합니다. 이 class에는 audio output을 문자열로 return하는String playAudio()method가 있어야 합니다. 그런 다음 legacy equipment를 나타내는VinylPlayerclass를 만듭니다. 이 class에는trackNamefield와*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가 현대적인AudioSourceinterface를 expects하는 code와 함께 구식 vinyl player를 작동시키는 방식을 보여 줍니다. track name이Bohemian Rhapsody인VinylPlayer를 Create합니다. 그런 다음 이 vinyl player를 감싸는VinylAdapter를 Create합니다. adapter를AudioSourcetype의 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()를 호출하고 결과를 출력하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Dart 컴파일러