Modo adaptador de Dios y mueca

Hoy es el séptimo artículo de la serie de aprendizaje de patrones de diseño: el patrón adaptador .

¿Las tres primeras preguntas?

  1. ¿Qué es el modo adaptador? ¿Cuál es el patrón de adaptador de la clase, el patrón de adaptador del objeto, el patrón de adaptador de la interfaz?
  2. ¿Cuál es la diferencia entre el modo adaptador y el modo decorador?
  3. ¿Cuáles son los escenarios de uso del modo adaptador?

Con estas pocas preguntas, comencemos hoy nuestro estudio.

Análisis del modo de adaptador

Hablando del modo adaptador, como sugiere el nombre, no es difícil de entender, déjame darte un ejemplo.

Creo que muchos de mis amigos han estado en Hong Kong para comprar cosas. Por ejemplo, una vez fui a Hong Kong a comprar un ipad air, pero el enchufe del cargador de la versión de Hong Kong no es compatible con nuestro enchufe continental.

Inserte la descripción de la imagen aquí

Pero lo he comprado de nuevo, pero este enchufe no se puede cargar directamente, ¿qué debo hacer? En ese momento, fui a Taobao y compré un convertidor.

Inserte la descripción de la imagen aquí

De esta manera, se puede usar felizmente. En el ejemplo anterior, la función del adaptador es ubicarse entre el enchufe de la versión de Hong Kong y nuestro enchufe de tierra firme. Su trabajo es convertir el enchufe de tierra firme en el enchufe de la versión de Hong Kong para poder insertar el enchufe de la versión de Hong Kong. Consiga electricidad. De hecho, el patrón del adaptador y los adaptadores del mundo real juegan el mismo papel: convertir una interfaz en otra interfaz para satisfacer las expectativas del cliente.

Nuestro proceso de uso del modo adaptador es generalmente el siguiente:

  1. El método de llamar al adaptador a través de la interfaz de destino realiza una solicitud al adaptador;
  2. El adaptador usa la interfaz adaptee para convertir la solicitud en una o más interfaces del adaptee;
  3. El cliente recibe el resultado de la llamada, pero no percibe que el adaptador está realizando la conversión;

Combinando el ejemplo anterior, la versión de Hong Kong del cabezal de carga es el cliente, necesita llamar al enchufe estándar de la versión de Hong Kong para cargar, y el convertidor comprado por Taobao es el adaptador, que implementa una interfaz de destino (proporciona la interfaz de enchufe de la versión de Hong Kong), y el adaptador es Nuestra interfaz de socket continental; Cabe señalar que el cliente y la parte emparejada están desacoplados, uno no se conoce al otro.

Defina el modo de adaptador:

Convierta la interfaz de una clase en otra interfaz que el cliente espera. Los adaptadores permiten que las clases con interfaces incompatibles trabajen juntas sin problemas.

El diagrama de clases es el siguiente:

Inserte la descripción de la imagen aquí

Patrón de adaptador lleno de buenos principios de diseño de OO: composición de objetos, para proporcionar una interfaz para modificar el paquete para que sea ​​más adecuado , este enfoque tiene la ventaja adicional de que se adapta a la clase de cualquier niño que puede emparejar el adaptador .

La idea central es tener una Adapteeclase, un método debe adaptarse a las interfaces de destino Target, por Adapterclase se Adapteeextenderá para funcionar Target.

Veamos un fragmento de código para profundizar nuestra comprensión:

/**被适配者*/
public class Adaptee {
    
    
    public void method1() {
    
    
        System.out.println("this is original method!");
    }
}
/**目标接口*/
public interface Target {
    
    
    /**
     * 与原类中的方法相同
     */
    public void method1();
    /**
     * 新类的方法
     */
    public void method2();
}
/**Adapter 实现 Target 接口,组合了Adaptee*/
public class Adapter implements Target {
    
    
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
    
    
        super();
        this.adaptee = adaptee;
    }

    @Override
    public void method2() {
    
    
        System.out.println("this is the target method!");
    }

    @Override
    public void method1() {
    
    
        adaptee.method1();
    }
}
/**测试类*/
public class AdapterTest {
    
    
    public static void main(String[] args) {
    
    
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.method1();
        target.method2();
    }
}

Hemos definido el modo de adaptador arriba, pero de hecho el modo de adaptador se divide en "adaptador de objeto", "adaptador de clase" y adaptador de "interfaz".

El diagrama de clases que dibujamos arriba es para adaptadores de objetos, echemos un vistazo a qué son los adaptadores de clase y los adaptadores de interfaz.

Adaptador de clase

Inserte la descripción de la imagen aquí

La diferencia es que la Adapterclase hereda la Adapteeclase que implementa Targetla interfaz:

/**
 * 类适配器
 */
public class Adapter extends Adaptee implements Target {
    @Override
    public void method2() {
        System.out.println("this is the target method!");
    }
}

Adaptador de interfaz

El tercer modo adaptador es el modo adaptador de la interfaz. El adaptador de la interfaz es así: A veces escribimos una interfaz con múltiples métodos abstractos. Cuando escribimos la clase de implementación de la interfaz, debemos implementar todos los métodos de la interfaz. Obviamente, a veces es un desperdicio, porque no todos los métodos son los que necesitamos, a veces solo algunos de ellos son necesarios. Para resolver este problema, introducimos el modo adaptador de la interfaz. Con la ayuda de una clase abstracta, la clase abstracta implementa el La interfaz implementa todos los métodos, y no nos ocupamos de la interfaz original, solo nos ponemos en contacto con la clase abstracta, por lo que escribimos una clase, heredamos la clase abstracta y reescribimos los métodos que necesitamos. Eche un vistazo al diagrama de clases:

Inserte la descripción de la imagen aquí

Esto está bien entendido En el desarrollo real, a menudo encontramos demasiados métodos definidos en esta interfaz, por lo que a veces no los necesitamos todos en algunas clases de implementación.

¿La diferencia entre el modo adaptador y decorador?

Después de aprender el patrón del adaptador, es posible que se sienta muy similar al patrón del decorador. Ambos sostienen una instancia de objeto y luego realizan el ensamblaje funcional.

Pero el enfoque de los dos es diferente: el adaptador envuelve un objeto para cambiar su interfaz; el decorador envuelve un objeto para agregar nuevos comportamientos y responsabilidades; y el modelo de apariencia que voy a escribir a continuación Un grupo de objetos está "envuelto" para simplificar su interfaz, así que estad atentos.

También tenga en cuenta aquí: el decorador no cambia la interfaz, solo agrega responsabilidad, y el adaptador convierte una interfaz en otra;

Escenarios de uso de Adaptor

Cuando necesite utilizar una clase existente y su interfaz no satisfaga sus necesidades, utilice un adaptador. Por ejemplo, el primer iterador de tipos de colección en el JDK es Enumeration. Pero luego, el nuevo JDK usó Iterator. Cuando enfrentamos el código heredado, estos códigos expusieron la interfaz de enumeración, pero también esperábamos usar solo iteradores en el nuevo código. Para resolver este problema, podemos construir un adaptador y mantener Enumera las instancias de la clase Enumeration, es decir, la adaptada.

Bueno, hemos aprendido el modo adaptador aquí. El concepto es muy fácil de entender. Espero que se haga estas preguntas con regularidad como al principio de este artículo. De lo contrario, esto es muy fácil de olvidar. Una vez que su cerebro lo haya resuelto, úselo en combinación cuando escriba código en el trabajo. Creo que su código será mejor. Cuanto más suave sea la escritura.


¡Se acabó el texto completo, luchando!

Supongo que te gusta

Origin blog.csdn.net/taurus_7c/article/details/107436469
Recomendado
Clasificación