-
[디자인 패턴][구조 패턴] - 어댑터 패턴CS/디자인패턴 2023. 7. 7. 15:52
1. 어댑터 패턴
호환되지 않는 인터페이스를 가진 두 개의 클래스를 함께 작동하도록 해주는 구조적인 패턴
인터페이스 호환성 문제를 해결하기 위해 사용- 사용하는 경우
- 기존의 클래스를 수정하지 않고 새로운 인터페이스를 사용하고 싶은 경우
- 이미 존재하는 클래스의 인터페이스를 다른 인터페이스로 변환해야 하는 경우
- 호환되지 않는 두 클래스 사이의 상호 작용이 필요한 경우
- 구현 방법
어댑터 패턴의 UML 다이어그램 - Target : 클라이언트가 사용하려는 인터페이스를 정의
- Adaptee : 기존에 존재하는 인터페이스를 가지고 있는 클래스
- Adapter : Target 인터페이스를 구현하고 Adaptee를 감싸서 사용하려는 인터페이스와 Adaptee의 인터페이스를 연결
- Client : 적응 대상과 Target 인터페이스 사이의 상호 작용을 요청하는 역할, 중간에 Adpter의 존재를 알 수 없음
- 방법에 따라 2가지로 나누어진다.
- Class Adapter 패턴 (상속):
- Adaptee 클래스를 상속받으면서 Target 인터페이스를 구현하는 Adapter 클래스를 생성
- Adapter 클래스에서는 Target 인터페이스의 메서드를 구현, 내부에서 Adaptee의 메서드를 호출하여 연결
- 이를 통해 Adapter 클래스는 Target 인터페이스를 클라이언트에 제공, Adaptee의 기능을 활용
- Instance Adapter 패턴 (위임):
- Adaptee 객체를 Adapter 클래스의 멤버 변수로 가지고, Target 인터페이스를 구현하는 Adapter 클래스를 생성
- Adapter 클래스에서는 Target 인터페이스의 메서드를 구현, 내부에서 Adaptee 객체의 메서드를 호출하여 연결
- 이를 통해 Adapter 클래스는 Target 인터페이스를 클라이언트에 제공, Adaptee의 기능을 위임하여 사용
- Class Adapter 패턴 (상속):
- 예시1. 상속(Class)
# 상속(Class) 방식 // Target 인터페이스 public interface MediaPlayer { void play(String audioType, String fileName); } // Adaptee 클래스 public class AdvancedMediaPlayer { public void playVlc(String fileName) { System.out.println("VLC 파일 재생: " + fileName); } public void playMp4(String fileName) { System.out.println("MP4 파일 재생: " + fileName); } } // Adapter 클래스: Adaptedd 클래스를 상속하고 Target 인터페이스를 구현 public class MediaAdapter extends AdvancedMediaPlayer implements MediaPlayer { @Override public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase("vlc")) { playVlc(fileName); } else if (audioType.equalsIgnoreCase("mp4")) { playMp4(fileName); } } } // Client public class AudioPlayer implements MediaPlayer { @Override public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase("mp3")) { System.out.println("MP3 파일 재생: " + fileName); } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) { MediaAdapter mediaAdapter = new MediaAdapter(); mediaAdapter.play(audioType, fileName); } else { System.out.println("잘못된 미디어 형식. " + audioType + " 형식은 지원되지 않습니다."); } } } // 테스트 public class Main { public static void main(String[] args) { AudioPlayer audioPlayer = new AudioPlayer(); audioPlayer.play("mp3", "노래.mp3"); audioPlayer.play("vlc", "영화.vlc"); audioPlayer.play("mp4", "비디오.mp4"); audioPlayer.play("avi", "영화.avi"); } }
2. 위임(Instance)
# 위임(Instance) // Target 인터페이스 public interface MediaPlayer { void play(String audioType, String fileName); } // Adaptee 클래스 public class AdvancedMediaPlayer { public void playVlc(String fileName) { System.out.println("VLC 파일 재생: " + fileName); } public void playMp4(String fileName) { System.out.println("MP4 파일 재생: " + fileName); } } // Adpater 클래스: Target 인터페이스를 구현하고 Adaptee 클래스를 포함 public class MediaAdapter implements MediaPlayer { private AdvancedMediaPlayer advancedMediaPlayer; public MediaAdapter(AdvancedMediaPlayer advancedMediaPlayer) { this.advancedMediaPlayer = advancedMediaPlayer; } @Override public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase("vlc")) { advancedMediaPlayer.playVlc(fileName); } else if (audioType.equalsIgnoreCase("mp4")) { advancedMediaPlayer.playMp4(fileName); } } } // Client public class AudioPlayer implements MediaPlayer { private MediaAdapter mediaAdapter; @Override public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase("mp3")) { System.out.println("MP3 파일 재생: " + fileName); } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) { AdvancedMediaPlayer advancedMediaPlayer; if (audioType.equalsIgnoreCase("vlc")) { advancedMediaPlayer = new AdvancedMediaPlayer(); mediaAdapter = new MediaAdapter(advancedMediaPlayer); } else { advancedMediaPlayer = new AdvancedMediaPlayer(); mediaAdapter = new MediaAdapter(advancedMediaPlayer); } mediaAdapter.play(audioType, fileName); } else { System.out.println("잘못된 미디어 형식. " + audioType + " 형식은 지원되지 않습니다."); } } } // 테스트 public class Main { public static void main(String[] args) { AudioPlayer audioPlayer = new AudioPlayer(); audioPlayer.play("mp3", "노래.mp3"); audioPlayer.play("vlc", "영화.vlc"); audioPlayer.play("mp4", "비디오.mp4"); audioPlayer.play("avi", "영화.avi"); } }
'CS > 디자인패턴' 카테고리의 다른 글
[디자인 패턴][구조 패턴] - 컴포지트 패턴 (0) 2023.07.11 [디자인 패턴][구조 패턴] - 브릿지 패턴 (0) 2023.07.10 [디자인 패턴][생성 패턴] - 빌더 패턴 (0) 2023.06.19 [디자인 패턴][생성 패턴] - 프로토타입 패턴 (0) 2023.06.13 [디자인 패턴][생성 패턴] - 싱글톤 패턴 (0) 2023.05.20 - 사용하는 경우