[ 목차 ]
안녕하세요. 오늘 알아볼 패턴은 어댑터(Adapter) 패턴입니다.
1. 어댑터(Adapter) 패턴 이란?
어댑터 패턴은 디자인 패턴 중 하나로, 서로 다른 인터페이스를 가진 클래스 또는 객체를 협력할 수 있도록 중간에서 연결해 주는 역할을 합니다. 즉, 기존 구현에서 변경 없이 호환되지 않는 클래스를 함께 사용할 수 있도록 변환해 주는 것이 목적입니다.
2. 어댑터(Adapter) 패턴 구현 방법 및 코드
어댑터 패턴을 구현하기 위해 필요한 요소는 다음과 같습니다.
- Target 인터페이스: 클라이언트가 사용하는 인터페이스입니다.
- Adaptee 클래스: 변환해야 하는 인터페이스를 가진 클래스입니다.
- Adapter 클래스: Target 인터페이스를 구현하며, Adaptee 클래스와의 결합을 촉진시키는 클래스입니다.
// Target 인터페이스
interface MediaPlayer {
void play(String mediaType, String fileName);
}
// Adaptee 클래스
class LegacyMediaPlayer {
void playAudioFile(String fileName) {
System.out.println("Playing audio file: " + fileName);
}
}
// Adapter 클래스
class MediaPlayerAdapter implements MediaPlayer {
private LegacyMediaPlayer legacyMediaPlayer;
public MediaPlayerAdapter(LegacyMediaPlayer legacyMediaPlayer) {
this.legacyMediaPlayer = legacyMediaPlayer;
}
@Override
public void play(String mediaType, String fileName) {
if ("audio".equalsIgnoreCase(mediaType)) {
legacyMediaPlayer.playAudioFile(fileName);
} else {
System.out.println("Unsupported media type: " + mediaType);
}
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
LegacyMediaPlayer legacyMediaPlayer = new LegacyMediaPlayer();
MediaPlayer mediaPlayer = new MediaPlayerAdapter(legacyMediaPlayer);
mediaPlayer.play("audio", "music.mp3");
mediaPlayer.play("video", "movie.mp4");
}
}
- MediaPlayer는 타깃 인터페이스로, 클라이언트가 사용할 인터페이스를 정의합니다. 이 경우 'play' 메서드를 포함하며, 이 메서드는 미디어 유형('mediaType')과 파일 이름('fileName')을 매개변수로 받습니다.
- LegacyMediaPlayer는 변환하려는 인터페이스를 갖는 클래스로, 오디오 파일만 재생할 수 있는 'playAudioFile' 메서드를 포함합니다.
- MediaPlayerAdapter는 MediaPlayer 인터페이스를 구현하고, 내부적으로 LegacyMediaPlayer 객체의 참조를 가져와서 사용합니다. MediaPlayer의 'play' 메서드를 구현할 때 'mediaType'이 오디오인 경우에만 LegacyMediaPlayer 인스턴스의 'playAudioFile' 메서드를 호출하고, 그렇지 않으면 "Unsupported media type" 메시지를 출력합니다.
- 메인에서는 LegacyMediaPlayer를 생성한 후, MediaPlayerAdapter를 통해 MediaPlayer 인터페이스를 구현하는 객체로 변환합니다. 클라이언트는 변환된 mediaPlayer 인스턴스를 사용하여 오디오 파일('music.mp3') 및 비디오 파일('movie.mp4')을 재생합니다.
3. 어댑터(Adapter) 패턴의 장단점
3.1. 장점
- 과거 코드를 수정하지 않고도 호환성 확보가 가능합니다.
- 여러 인터페이스를 같은 형태로 사용할 수 있어 개발자가 작업을 수월하게 처리할 수 있습니다.
3.2. 단점
- 추가적인 코드(어댑터 클래스)가 필요하여 복잡성이 증가할 수 있습니다.
- 모든 기능에 대한 어댑터를 작성해야 할 수도 있어 많은 작업량이 발생할 수 있습니다.
4. 어댑터(Adapter) 패턴의 활용 예
어댑터 패턴은 여러 환경에서 활용가능하며, 주로 기존에 사용하던 시스템이나 라이브러리와 새로운 시스템 간의 호환성 문제를 해결할 때 유용합니다. 예를 들어 다양한 오디오 포맷을 지원하는 미디어 플레이어를 만드는 과정에서, 기존의 오디오 플레이어를 새로운 플레이어와 호환되게끔 작업할 때 어댑터 패턴을 사용할 수 있습니다.
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴
2023.07.12 - [JAVA] - Java 디자인패턴 - 옵저버(Observer) 패턴
2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴
'JAVA' 카테고리의 다른 글
JAVA 디자인패턴 - 비지터(Visitor) 패턴의 정의, 장점, 구현 (0) | 2023.07.12 |
---|---|
JAVA 디자인패턴 - 이터레이터(Iterator) 패턴의 정의, 사용 이유, 구현방법 (0) | 2023.07.12 |
JAVA 디자인패턴 - 팩토리(Factory) 패턴 (0) | 2023.07.12 |
JAVA 디자인패턴 - 싱글톤(Singleton) 패턴 (0) | 2023.07.12 |
자바 레코드(JAVA RECORD) 개념, 특징, 사용법, 장점, 단점, 활용 사례 (0) | 2023.07.11 |
댓글