mode adaptateur
Le modèle d'adaptateur sert de pont entre deux interfaces incompatibles. Ce type de modèle de conception est un modèle structurel qui combine les fonctionnalités de deux interfaces indépendantes.
Ce modèle implique une seule classe chargée d'ajouter des fonctionnalités d'interface indépendantes ou incompatibles. Pour donner un exemple concret, le lecteur de carte fait office d'adaptateur entre la carte mémoire et l'ordinateur portable. Vous insérez la carte mémoire dans le lecteur de carte, puis insérez le lecteur de carte dans l'ordinateur portable, afin que la carte mémoire puisse être lue via l'ordinateur portable.
Nous démontrons l'utilisation du modèle d'adaptateur à travers l'exemple suivant. Parmi eux, le lecteur audio ne peut lire que les fichiers mp3, en utilisant un lecteur audio plus avancé pour lire les fichiers VLC et mp4.
Introduction
Intention : Convertir l'interface d'une classe en une autre interface souhaitée par le client. Le modèle Adapter permet à des classes de travailler ensemble qui autrement ne fonctionneraient pas ensemble en raison d'interfaces incompatibles.
Solution principale : Solution principale : Dans les systèmes logiciels, il est souvent nécessaire de placer certains "objets existants" dans un nouvel environnement, et les interfaces requises par le nouvel environnement ne peuvent pas être satisfaites par les objets existants.
Quand utiliser : 1. Le système doit utiliser les classes existantes, mais l'interface de ce type ne répond pas aux besoins du système. 2. Vous souhaitez créer une classe qui peut être réutilisée pour travailler avec certaines classes qui ne sont pas très liées les unes aux autres, y compris certaines classes qui pourraient être introduites à l'avenir. Ces classes sources n'ont pas nécessairement d'interfaces cohérentes. 3. Insérez une classe dans une autre classe via la conversion d'interface. (Par exemple, les tigres et les oiseaux ont désormais un tigre volant. Sans avoir besoin d'ajouter des entités, ajoutez un adaptateur pour contenir un objet tigre et implémentez l'interface volante.)
Comment résoudre : Hériter ou dépendre (recommandé).
Code clé : L'adaptateur hérite ou s'appuie sur des objets existants pour atteindre l'interface cible souhaitée.
Exemples d'application : 1. Les appareils électriques américains sont de 110 V et la Chine est de 220 V. Un adaptateur est nécessaire pour convertir 110 V en 220 V. 2. JAVA JDK 1.1 fournit l'interface Enumeration et 1.2 fournit l'interface Iterator. Si vous souhaitez utiliser le JDK 1.2, vous devez convertir l'interface Enumeration du système précédent en interface Iterator. Dans ce cas, le mode adaptateur est requis. . 3. Exécutez le programme WINDOWS sous LINUX. 4. jdbc en JAVA.
Avantages : 1. Deux classes non liées peuvent être exécutées ensemble. 2. Réutilisation améliorée des classes. 3. Augmentation de la transparence de la classe. 4. Bonne flexibilité.
Inconvénients : 1. Une utilisation excessive d'adaptateurs rendra le système très compliqué et difficile à comprendre dans son ensemble. Par exemple, il est évident que l'interface A est appelée, mais en fait elle est adaptée en interne à l'implémentation de l'interface B. Si cela se produit trop dans un système, cela équivaudra à un désastre. Par conséquent, si cela n’est pas nécessaire, vous pouvez reconstruire le système directement sans utiliser l’adaptateur. 2. Étant donné que JAVA hérite d'au plus une classe, il ne peut s'adapter qu'à au plus une classe d'adaptateur et la classe cible doit être une classe abstraite.
Scénario d'utilisation : Si vous êtes motivé à modifier l'interface d'un système fonctionnant normalement, vous devriez envisager d'utiliser le modèle d'adaptateur.
Remarque : L'adaptateur n'est pas ajouté lors de la conception détaillée, mais pour résoudre des problèmes pour le projet en service.
Impléments
Nous avons une interface MediaPlayer et une classe d'entité AudioPlayer qui implémente l'interface MediaPlayer. Par défaut, AudioPlayer peut lire des fichiers audio au format mp3.
Nous avons une autre interface AdvancedMediaPlayer et une classe d'entité qui implémente l'interface AdvancedMediaPlayer. Cette classe peut lire des fichiers aux formats VLC et MP4.
Nous voulons laisser AudioPlayer lire des fichiers audio dans d'autres formats. Pour réaliser cette fonction, nous devons créer une classe d'adaptateur MediaAdapter qui implémente l'interface MediaPlayer et utiliser l'objet AdvancedMediaPlayer pour lire le format requis.
AudioPlayer utilise la classe d'adaptateur MediaAdapter pour transmettre le type audio requis sans connaître la classe réelle qui peut lire l'audio dans le format requis. AdapterPatternDemo, notre classe de démonstration utilise la classe AudioPlayer pour lire différents formats.
Étape 1
Créer des interfaces pour les lecteurs multimédias et les lecteurs multimédias plus avancés.
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); }
Étape 2
Créer et mettre en œuvreAdvancedMediaPlayer Classe d'entité de l'interface.
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); } }
Étape 3
Création implémentée
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); } } }Étape 4Créez une classe d'entité qui implémente l'interface
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"); } } }Étape 5Utilisez AudioPlayer pour lire différents types de formats audio.
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"); } }Étape 6Vérifiez la sortie.
Playing mp3 file. Name: beyond the horizon.mp3 Playing mp4 file. Name: alone.mp4 Playing vlc file. Name: far far away.vlc Invalid media. avi format not supported