어댑터 모드
어댑터 패턴은 호환되지 않는 두 인터페이스 사이의 브리지 역할을 합니다. 이러한 유형의 디자인 패턴은 두 개의 독립적인 인터페이스의 기능을 결합한 구조적 패턴입니다.
이 패턴에는 독립적이거나 호환되지 않는 인터페이스 기능을 추가하는 단일 클래스가 포함됩니다. 실제 예를 들자면, 카드 리더는 메모리 카드와 노트북 사이의 어댑터 역할을 합니다. 메모리 카드를 카드 리더기에 삽입한 다음, 카드 리더기를 노트북에 삽입하면 노트북을 통해 메모리 카드를 읽을 수 있습니다.
다음 예제를 통해 어댑터 패턴의 사용을 보여줍니다. 그 중 오디오 플레이어 장치는 vlc 및 mp4 파일을 재생하는 고급 오디오 플레이어를 사용하여 mp3 파일만 재생할 수 있습니다.
Introduction
의도: 클래스의 인터페이스를 고객이 원하는 다른 인터페이스로 변환합니다. 어댑터 패턴을 사용하면 호환되지 않는 인터페이스로 인해 함께 작동하지 않는 클래스가 함께 작동할 수 있습니다.
주요 솔루션: 주로 소프트웨어 시스템에서 해결되며 일부 "기존 개체"를 새로운 환경에 배치해야 하는 경우가 많으며 새 환경에서 요구하는 인터페이스는 기존 개체로 충족될 수 없습니다.
사용 시기: 1. 시스템은 기존 클래스를 사용해야 하지만 이러한 유형의 인터페이스는 시스템 요구 사항을 충족하지 않습니다. 2. 나중에 도입될 수 있는 일부 클래스를 포함하여 서로 별로 관련되지 않은 일부 클래스와 작업하기 위해 재사용할 수 있는 클래스를 생성하려고 합니다. 이러한 소스 클래스에는 반드시 일관된 인터페이스가 필요하지 않습니다. 3. 인터페이스 변환을 통해 클래스를 다른 클래스에 삽입합니다. (예를 들어 호랑이와 새에는 이제 날아다니는 호랑이가 있습니다. 엔터티를 추가할 필요 없이 호랑이 개체를 포함하는 어댑터를 추가하고 나는 인터페이스를 구현합니다.)
해결 방법: 상속 또는 종속성(권장).
키 코드: 어댑터는 원하는 대상 인터페이스를 달성하기 위해 기존 개체를 상속하거나 의존합니다.
적용 예: 1. 미국 전기 제품은 110V이고 중국은 220V입니다. 110V를 220V로 변환하려면 어댑터가 필요합니다. 2. JAVA JDK 1.1은 Enumeration 인터페이스를 제공하고, 1.2는 Iterator 인터페이스를 제공합니다. 1.2 JDK를 사용하려면 이전 시스템의 Enumeration 인터페이스를 Iterator 인터페이스로 변환해야 합니다. 이 경우 어댑터 모드가 필요합니다. . 3. LINUX에서 WINDOWS 프로그램을 실행합니다. 4. JAVA의 jdbc.
장점: 1. 서로 관련이 없는 두 수업을 함께 진행할 수 있습니다. 2. 클래스 재사용이 개선되었습니다. 3. 수업의 투명성을 높였습니다. 4. 유연성이 좋습니다.
단점: 1. 어댑터를 과도하게 사용하면 시스템이 매우 지저분해지고 전체적으로 파악하기 어려워집니다. 예를 들어, A 인터페이스가 호출되는 것은 당연하지만 실제로는 B 인터페이스 구현에 맞게 내부적으로 조정되었습니다. 시스템에서 이러한 일이 너무 많이 발생하면 재앙과 같습니다. 따라서 필요하지 않은 경우에는 어댑터를 사용하지 않고 시스템을 직접 재구성할 수 있습니다. 2. JAVA는 최대 하나의 클래스를 상속하므로 최대 하나의 어댑터 클래스에만 적응할 수 있으며 대상 클래스는 추상 클래스여야 합니다.
사용 시나리오: 정상적으로 실행되는 시스템의 인터페이스를 수정하려는 동기가 있는 경우 어댑터 패턴 사용을 고려해야 합니다.
참고: 어댑터는 상세 설계 중에 추가되는 것이 아니라 서비스 중인 프로젝트의 문제를 해결하기 위해 추가됩니다.
구현
우리는 MediaPlayer 인터페이스와 MediaPlayer 인터페이스를 구현하는 엔터티 클래스 AudioPlayer를 가지고 있습니다. 기본적으로 AudioPlayer는 mp3 형식의 오디오 파일을 재생할 수 있습니다.
또 다른 인터페이스 AdvancedMediaPlayer와 AdvancedMediaPlayer 인터페이스를 구현하는 엔터티 클래스가 있습니다. 이 클래스는 vlc 및 mp4 형식의 파일을 재생할 수 있습니다.
우리는 AudioPlayer가 다른 형식의 오디오 파일을 재생할 수 있도록 하고 싶습니다. 이 기능을 구현하려면 MediaPlayer 인터페이스를 구현하는 어댑터 클래스 MediaAdapter를 만들고 AdvancedMediaPlayer 개체를 사용하여 필요한 형식을 재생해야 합니다.
AudioPlayer 필요한 형식으로 오디오를 재생할 수 있는 실제 클래스를 알지 못한 채 필요한 오디오 유형을 전달하려면 어댑터 클래스 MediaAdapter를 사용하세요. AdapterPatternDemo, 데모 클래스는 AudioPlayer 클래스를 사용하여 다양한 형식을 재생합니다.
1단계
미디어 플레이어 및 고급 미디어 플레이어용 인터페이스를 만듭니다.
MediaPlayer.java
public interface MediaPlayer { public void play(String audioType, String fileName); }
AdvancedMediaPlayer.java
public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); }
2단계
AdvancedMediaPlayer 인터페이스를 구현하는 엔터티 클래스를 만듭니다.
VlcPlayer.java
public class VlcPlayer implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+ fileName); } @Override public void playMp4(String fileName) { //什么也不做 } }
Mp4Player.java
public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { //什么也不做 } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } }
3단계
MediaPlayer 인터페이스를 구현하는 어댑터 클래스를 만듭니다.
MediaAdapter.java
public class MediaAdapter implements MediaPlayer { AdvancedMediaPlayer advancedMusicPlayer; public MediaAdapter(String audioType){ if(audioType.equalsIgnoreCase("vlc") ){ advancedMusicPlayer = new VlcPlayer(); } else if (audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer = new Mp4Player(); } } @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")){ advancedMusicPlayer.playVlc(fileName); }else if(audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer.playMp4(fileName); } } }
4단계
MediaPlayer 인터페이스를 구현하는 엔터티 클래스를 만듭니다.
AudioPlayer.java
public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @Override public void play(String audioType, String fileName) { //播放 mp3 音乐文件的内置支持 if(audioType.equalsIgnoreCase("mp3")){ System.out.println("Playing mp3 file. Name: "+ fileName); } //mediaAdapter 提供了播放其他文件格式的支持 else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){ mediaAdapter = new MediaAdapter(audioType); mediaAdapter.play(audioType, fileName); } else{ System.out.println("Invalid media. "+ audioType + " format not supported"); } } }
5단계
AudioPlayer를 사용하여 다양한 유형의 오디오 형식을 재생합니다.
AdapterPatternDemo.java
public class AdapterPatternDemo { public static void main(String[] args) { AudioPlayer audioPlayer = new AudioPlayer(); audioPlayer.play("mp3", "beyond the horizon.mp3"); audioPlayer.play("mp4", "alone.mp4"); audioPlayer.play("vlc", "far far away.vlc"); audioPlayer.play("avi", "mind me.avi"); } }
6단계
출력을 확인합니다.
rreee