Notas de estudio del modo de diseño --- 6. Modo de adaptador

  • El patrón adaptador (Patrón adaptador) se usa como un puente entre dos interfaces incompatibles; este patrón de diseño es un patrón estructural, que combina las funciones de dos interfaces independientes;

  • Este modelo involucra una sola clase, que es responsable de agregar funciones de interfaz independientes o incompatibles; por ejemplo, el lector de tarjetas se usa como un adaptador entre la tarjeta de memoria y la computadora portátil.

  • Intención: reemplazar una interfaz de clase con otra interfaz deseada por el cliente. El modo adaptador permite que las clases que no pueden funcionar juntas debido a interfaces incompatibles funcionen juntas;

  • Solución principal: Resolver principalmente en el sistema de software, a menudo es necesario colocar algunos "objetos existentes" en el nuevo entorno, y el objeto explícito no satisface la interfaz requerida por el nuevo entorno;

  • Cuando usar:

    • 1. El sistema necesita usar las clases existentes, y tales interfaces no satisfacen las necesidades del sistema;

    • 2. Quiero crear una clase reutilizable para algunas clases que no tienen mucha relación entre sí, incluidas algunas clases que pueden introducirse en el futuro, estas clases de origen pueden no tener necesariamente una interfaz coherente;

    • 3. A través de la transformación de la interfaz, inserte una clase en otro sistema de clases. (Por ejemplo, tigres y pájaros, ahora hay un tigre volador adicional. Sin aumentar la demanda de la entidad, agregue un adaptador para contener un objeto tigre para implementar la interfaz voladora)

  • Cómo resolver:

    • Herencia

    • Dependiente (recomendado);

  • Código clave: el adaptador hereda o depende de los objetos existentes para lograr la interfaz de destino deseada;

  • Ejemplos de aplicación:

    • 1. American Electric 110V, chino 220V, hay un adaptador para convertir 110V a 220V;

    • 2. Java JDK1.1 proporciona la interfaz Enumeration, y la interfaz Iterator se proporciona en 1.2. Si desea utilizar el 1.2 JDK, debe convertir la interfaz Enumeration del sistema anterior a la interfaz Iterator. Esto requiere el modo adaptador;

    • 3. Ejecute el programa WINDOWS en Linux;

    • 4. JDBC en Java;

  • Ventajas:

    • 1. Puede ejecutar cualquiera de los dos instrumentos relacionados;

    • 2. Mejorar la reutilización de las lágrimas;

    • 3. Mayor transparencia cansada;

    • 4. Buena flexibilidad;

  • Desventajas

    • 1. El uso excesivo de adaptadores hará que el sistema sea muy desordenado y no sea comprendido como un todo;

    • 2. Obviamente, la interfaz A se llama, de hecho, se adapta internamente a la implementación de la interfaz B. Si un sistema tiene demasiadas situaciones de este tipo, es equivalente a un desastre;

    • 3. Porque si no es muy necesario, no puede adaptar el adaptador, sino reconstruir directamente el sistema;

    • 4. Como Java hereda más de una clase, como máximo solo se puede adaptar una clase de adaptador, y la clase de destino debe ser una clase abstracta;

  • Escenario de uso:

    • Motivado para modificar la interfaz de un sistema operativo normal, debe considerarse el modo adaptador;

  • Asuntos que requieren atención:

    • El adaptador no se agrega en el diseño detallado, sino para resolver el problema del proyecto en servicio;

  • Combate real:

    • Tenemos una interfaz MediaPlayer y una clase de entidad AudioPlayer que implementa la interfaz MediaPlayer. De forma predeterminada, AudioPlayer puede reproducir archivos de audio en formato mp3;

    • También tenemos otra interfaz AdvancedMediaPlayer y una clase de entidad que implementa la interfaz AdvancedMediaPlayer; esta clase puede reproducir archivos en formato vlc y mp4;

    • Queremos crear archivos de audio del reproductor AudioPlayer en otros formatos. Para lograr esta función, necesitamos crear una clase de adaptador MediaAdapter que implemente la interfaz MediaPlayer y usar el objeto AdvancedMediaPlayer para reproducir el formato requerido;

    • AudioPlayer usa la clase de adaptador MediaAdapter para pasar el tipo de audio requerido, sin conocer la clase real que puede reproducir el formato de audio requerido;

    • AdapterPatternDemo, nuestra clase de demostración utiliza la clase AudioPlayer para reproducir varios formatos;

 

package adapter;

/**
 * @author yangxin_ryan
 */
public interface MediaPlayer {

    public void play(String audioType, String fileName);

}
package adapter;

/**
 * @author yangxin_ryan
 */
public interface AdvancedMediaPlayer {
    public void playVlc(String fileName);
    public void playMp4(String fileName);
}
package adapter;

/**
 * @author yangxin_ryan
 */
public class VlcPlayer implements AdvancedMediaPlayer {

    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    public void playMp4(String fileName) {
        //
    }
}
package adapter;

/**
 * @author yangxin_ryan 
 */
public class Mp4Player implements AdvancedMediaPlayer {

    public void playVlc(String fileName) {
        //
    }

    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}
package adapter;

/**
 * @author yangxin_ryan 
 */
public class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer = new Mp4Player();
        }
    }

    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}
package adapter;

/**
 * @author yangxin_ryan
 */
public class AudioPlayer implements MediaPlayer {

    MediaAdapter mediaAdapter;

    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid meaid. " + audioType + " format not supported");
        }
    }
}
package adapter;

/**
 * @author yangxin_ryan
 */
public class AdpaterPatternDemo {

    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();
        audioPlayer.play("mp3", "byond the borizon.mp3");
        audioPlayer.play("mp4", "alone.mp4");
        audioPlayer.play("vlc", "far far away.vlc");
        audioPlayer.play("avi", "mind me.avi");
    }
}

 

Artículos originales publicados en 1980 · elogiados 708 · 3.66 millones de visitas +

Supongo que te gusta

Origin blog.csdn.net/u012965373/article/details/105656946
Recomendado
Clasificación