El "modo adaptador" de los patrones de diseño escritos para mí

1. Introducción

Es decir, defina una clase de empaquetado para empaquetar objetos incompatibles

Clase de envoltura = adaptador
Clase envuelta = adaptado

1.1 Escena

  • El sistema necesita reutilizar las clases existentes y la interfaz de esta clase no cumple con los requisitos del sistema.
  • Varios componentes tienen funciones similares, pero las interfaces no son uniformes y pueden cambiar con frecuencia

1.2 Ventajas

  • Mejor reutilización El
    sistema necesita usar clases existentes y tales interfaces no satisfacen las necesidades del sistema.
  • Transparente y simple El
    cliente puede llamar a la misma interfaz, por lo que es transparente para el cliente
  • Mejor escalabilidad
    Al implementar la función del adaptador, puede llamar a la función desarrollada por usted mismo, expandiendo así naturalmente la función del sistema
  • Desacoplamiento Desacople
    la clase de destino y la clase de adaptador, y reutilice la clase de adaptador existente introduciendo una clase de adaptador sin modificar el código original
  • Cumplir con el principio de abrir-cerrar. El
    mismo adaptador puede adaptar tanto la clase de adaptador como sus subclases a la interfaz de destino; se pueden implementar diferentes adaptadores para diferentes interfaces de destino sin modificar la clase a adaptar

1.3 Desventajas

  • El uso excesivo de adaptadores hará que el sistema sea muy complicado y difícil de comprender en su conjunto.

1.4 Clasificación

  • Adaptador de clase
  • Adaptador de objeto

2. Adaptador de clase

Utilice la relación de herencia para convertir el método de la clase envuelta en el método de destino

2.1 Escena

  • Necesidad de redefinir parte del comportamiento de Adaptee
  • Cuando quieras usarlo cómodamente

2.2 Ventajas

  • Código simplificado y fácil de usar.
    Solo se introduce un objeto y no se necesitan campos adicionales para hacer referencia a la instancia de Adaptee.
    Desventajas

2.3 Desventajas

  • Alto acoplamiento, baja flexibilidad, el
    uso de la herencia de objetos es una definición estática

2.4 Uso

1. 创建目标接口
public interface Target {
    
    
    void requestFnc();
}

2. 创建被包装的类
public class Adaptee {
    
    
    public void sourceFnc() {
    
    
        System.out.println("adaptee fnc.");
    }
}

3. 创建适配类
/**
 * 类的适配器模式:使用继承关系连接到Adaptee类
 *
 * @author dkangel
 */
public class ClassAdapter extends Adaptee implements Target {
    
    
    /**
     * 适配目标方法
     */
    @Override
    public void requestFnc() {
    
    
        super.sourceFnc();
        System.out.println("convert sourceFnc to requestFnc.");
    }
}

4. 使用
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Target target = new ClassAdapter();
        target.requestFnc();
    }
}

3. Adaptador de objetos

Al igual que el adaptador de la clase, el método de la clase envuelta se convierte en el método de destino

Diferente: el adaptador de la clase usa la relación de herencia para conectarse al adaptador y el adaptador del objeto usa la relación de delegación para conectarse al adaptador

2.1 Escena

  • Uso flexible
  • Necesita configurar la clase fuente y sus subclases al mismo tiempo

2.2 Ventajas

  • Alta flexibilidad y bajo acoplamiento El
    método adoptado 对象组合es un método de combinación dinámica

2.3 Desventajas

  • El uso complejo
    requiere la introducción de instancias de objetos

2.4 Uso

1. 创建目标接口
public interface Target {
    
    
    void requestFnc();
}

2. 创建被包装的类
public class Adaptee {
    
    
    public void sourceFnc() {
    
    
        System.out.println("adaptee fnc.");
    }
}

3. 创建适配类
/**
 * 对象的适配器模式:使用委派关系连接到Adaptee类
 *
 * @author dkangel
 */
public class ObjAdapter implements Target {
    
    

    private Adaptee adaptee;

    public ObjAdapter(Adaptee adaptee) {
    
    
        this.adaptee = adaptee;
    }

    @Override
    public void requestFnc() {
    
    
        this.adaptee.sourceFnc();
        System.out.println("convert sourceFnc to requestFnc.");
    }
}

Supongo que te gusta

Origin blog.csdn.net/Dkangel/article/details/105725574
Recomendado
Clasificación