Patrón de diseño 06 Patrón de adaptador

El patrón adaptador es un patrón estructural

Descripción general

Los patrones estructurales se centran en cómo organizar clases u objetos existentes para formar una estructura más poderosa.

En la vida, a menudo nos encontramos con un problema de este tipo: los portátiles delgados y livianos generalmente solo tienen interfaces tipo C o USB-A y no tienen puertos de red. Sin embargo, en el uso diario muchas veces es necesario conectarse al puerto de red para acceder a Internet, la primera solución que nos viene a la mente es comprar un adaptador o estación de acoplamiento . Pueden convertir tipo-c o usb-a en otros tipos de interfaces para que las usemos. De hecho, este es un modo adaptador .

¿ Por qué nuestro cabezal de carga de uso común se llama adaptador de corriente ? La fuente de alimentación tradicional es de 220 V CA, pero es posible que los teléfonos móviles solo requieran 5 V para cargarse, por lo que, aunque ahora hay energía, no se pueden cargar directamente. Tampoco es posible pedir a la compañía eléctrica que nos proporcione una fuente de alimentación de 5V DC, en este momento entra en juego el adaptador de corriente. Por ejemplo, el ancestral cabezal de carga 5V1A de Apple en realidad convierte la energía de 220 V de CA en energía de 5 V de CC para la transmisión. Esto equivale a desempeñar el papel de adaptador entre 220V AC y teléfonos móviles .

El patrón de adaptador se divide en adaptador de clase y adaptador de objeto.

Código

A continuación se muestra un ejemplo de una computadora que requiere un adaptador para conectarse a un cable de red para acceder a Internet:

adaptador de clase

1. Definir computadora

/**
 * 电脑
 * <p>想上网,需要插网线
 */
public class Computer {
    
    

    /**
     * 电脑需要连接上转换器才可以上网
     *
     * @param adapter 转接器
     */
    public void connect(NetToUsb adapter) {
    
    
        
        // 上网的具体实现,找一个转接头
        adapter.connectNetLine();
    }
}

2. Definir el cable de red.

/**
 * 网线
 */
public class NetLine {
    
    

    /**
     * 上网
     */
    public void online(){
    
    
        System.out.println("连接网线上网");
    }
}

3. Defina el adaptador de puerto USB a red.

/**
 * 转接器
 */
public interface NetToUsb {
    
    

    /**
     * 处理请求,usb -> 网线
     */
    void connectNetLine();
}

4. Definir adaptador de clase

/**
 * 类适配器
 */
public class ClassAdapter extends NetLine implements NetToUsb {
    
    

    @Override
    public void connectNetLine() {
    
    
        // 可以上网了
        super.online();
    }
}

5. Utilice el adaptador para conectarse al cable de red para acceder a Internet.

// 电脑
Computer computer = new Computer();
// 转接器已经插上网线
ClassAdapter adapter = new ClassAdapter();
// 电脑连接转接器,成功上网
computer.connect(adapter);

Esta implementación requiere ocupar un bit de herencia. Si NetToUsb no es una interfaz sino una clase abstracta en este momento, no se puede implementar porque Java no admite la herencia múltiple. Al mismo tiempo, de acuerdo con el principio de síntesis y reutilización, las funciones deberían implementarse más mediante síntesis.

Así que echemos un vistazo al segundo, que también es el patrón más utilizado: adaptador de objeto .

adaptador de objetos

4. Definir adaptador de objeto

/**
 * 对象适配器
 */
public class ObjectAdapter implements NetToUsb {
    
    

    /**
     * 网线
     */
    private NetLine netLine;

    public ObjectAdapter(NetLine netLine) {
    
    
        this.netLine = netLine;
    }

    @Override
    public void connectNetLine() {
    
    
        // 可以上网了
        netLine.online();
    }
}

5. Utilice el adaptador para conectarse al cable de red para acceder a Internet.

/**
 * 测试示例
 */
public class ObjectAdapterTest {
    
    

    @Test
    public void test() {
    
    
        // 电脑
        Computer computer = new Computer();
        // 网线
        NetLine netLine = new NetLine();
        // 转接器插上网线
        ObjectAdapter adapter = new ObjectAdapter(netLine);
        // 电脑连接转接器,成功上网
        computer.connect(adapter);
    }

}

Este método no ocupa bits de herencia, cumple con el principio de composición y reutilización, tiene menor acoplamiento y es más flexible, por lo que se recomienda .

Ventajas y desventajas

ventaja

1. Dos clases cualesquiera no relacionadas se pueden ejecutar juntas.

2. Reutilización de clases mejorada.

3. Aumentó la transparencia de la clase.

4. Buena flexibilidad.

defecto

1. El uso excesivo de adaptadores hará que el sistema sea muy complicado y difícil de entender en su totalidad. Por ejemplo, es obvio que se llama a la interfaz A, pero de hecho está internamente adaptada para implementar la interfaz B. Si esto sucede demasiado en un sistema, será equivalente a un desastre. Por tanto, si no es necesario, puedes reconstruir el sistema directamente sin utilizar el adaptador.

2. Dado que Java hereda como máximo una clase, solo puede adaptarse como máximo a una clase y la clase de destino debe ser una clase abstracta.

escenas a utilizar

Si está motivado para modificar la interfaz de un sistema en funcionamiento, debería considerar utilizar el patrón Adaptador.

Precauciones

Los adaptadores no se agregan durante el diseño detallado, sino para resolver problemas del proyecto en servicio.


referencia

https://www.bilibili.com/video/BV1mc411h719?p=7&vd_source=299f4bc123b19e7d6f66fefd8f124a03

Supongo que te gusta

Origin blog.csdn.net/qq_37770674/article/details/132455710
Recomendado
Clasificación