[Tipo de estructura] Modo adaptador

Código 1 Patrón de adaptador (herencia)

package com.fly.patterns.adapter.jicheng;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: Banner
 * @date 2023/5/30下午 4:21
 */
public class Banner {
    
    
    private String string;

    public Banner(String string){
    
    
        this.string = string;
    }

    public void showWithParen(){
    
    
        System.out.println("("+ string +")");
    }

    public void showWithAster(){
    
    
        System.out.println("*"+ string +"*");
    }
}

package com.fly.patterns.adapter.jicheng;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 接口类
 * @date 2023/5/30下午 4:23
 */
public interface Print {
    
    
    public abstract void printWeak();
    public abstract void printStrong();

}

package com.fly.patterns.adapter.jicheng;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 发挥适配器功能,它先扩充既有的Banner类,然后继承showWithParen与showWithAster方法。
 *               另外还要实现需要的Print接口,再实现printWeak与printStrong方法;这样PrintBannert就发挥了适配器功能。
 * @date 2023/5/30下午 4:24
 */
public class PrintBannert extends Banner implements Print{
    
    
    public PrintBannert(String string) {
    
    
        super(string);
    }

    @Override
    public void printWeak() {
    
    
        this.showWithParen();
    }

    @Override
    public void printStrong() {
    
    
        this.showWithAster();
    }

    public void myMethod() {
    
    
        System.out.println("啦啦啦");
    }
}

Patrón de adaptador de código 2 (delegación)

package com.fly.patterns.adapter.weituo;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @date 2023/5/30下午 4:40
 */
public abstract class Print {
    
    
    public abstract void printWeak();
    public abstract void printStrong();
}

package com.fly.patterns.adapter.weituo;

import com.fly.patterns.adapter.jicheng.Banner;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @date 2023/5/30下午 4:41
 */
public class PrintBannert extends Print{
    
    
    private Banner banner;

    public PrintBannert(String string){
    
    
        this.banner = new Banner(string);
    }

    @Override
    public void printWeak() {
    
    
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
    
    
        banner.showWithAster();
    }
}

clase de prueba

package com.fly.patterns.adapter;

import com.fly.patterns.adapter.jicheng.Print;
import com.fly.patterns.adapter.jicheng.PrintBannert;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 测试类- 仅把字符串输出成 (Hello )  或  *Hello *
 * @date 2023/5/30下午 4:27
 */
public class Main {
    
    
    public static void main(String[] args) {
    
    
        // 下面代码就可以看出有 Banner 类存在和它的内部方法,直接通过适配调用Banner类了。
        // 这种就是继承方式
        Print p = new PrintBannert("Hello");
        p.printWeak();
        p.printStrong();


        com.fly.patterns.adapter.weituo.PrintBannert hello = new com.fly.patterns.adapter.weituo.PrintBannert("Hello");
        hello.printWeak();
        hello.printStrong();

        // 针对上面两种方法 其实第二个感觉很方便,那为什么还要使用第一个方式呢?
        //  其实是因为想强调 只使用 Print 接口的方法。在使用中 PrintBannert 类跟 Print 接口的方法虽然相同,但是在开发中不一定,
        //  PrintBannert类在实际中可能实现了很多的其他的一些方法,所以我先将其指定到 Print 类型变量后在使用,我只利用并且只使用Print接口的方法,而不是PrintBannert类的方法。

        //下面是一种骚操作,其实就是p的对象实例还是PrintBannert类的实例,可以【强迫转型】调用其内部方法。
        ((PrintBannert)p).myMethod();

    }
}

Patrón adaptador (tipo de estructura)

Reempaquetar para reutilizar

  • En el mundo de los programas, si hay contenido que no se puede utilizar directamente, suele ser necesario convertirlo al tipo necesario antes de utilizarlo.
  • Este patrón de diseño es como un producto ordinario que se puede usar como regalo después de haber sido empacado exquisitamente. Después de empacar cierto contenido, se puede usar para otros fines.

Aquellos con esta capacidad de conversión se pueden extender como envoltorios o adaptadores.

  • Hay 2 patrones de adaptador:
    • Patrón adaptador (herencia) de la clase
    • Patrón de adaptador de objeto (delegación)

Casos de uso:

1. Patrón de adaptador (herencia)

  • El Banner de contenido existente se adapta a
  • Adaptador convertidor PrintBanner
  • Resultado requerido Interfaz de impresión (printWeak, printStrong)

2. Patrón de adaptador (delegación)

  • Aquí debe modificar Imprimir a una clase abstracta
  • PrintBannert se delega a Banner para ejecutar

3. En herencia y delegación, si es una adaptación de una clase, entonces la herencia puede usarse para aprovechar la adaptación.Si es una adaptación de un objeto, debe cambiarse a una forma delegada para usar la adaptación.

Escenas a utilizar

  • El uso del patrón de adaptador puede ayudarlo a ahorrar tiempo en la creación de los grupos de métodos necesarios. En caso de errores en el programa, debido a que está seguro de que las clases existentes están bien, solo necesita verificar las clases adaptadas, lo que reduce la carga del programa. inspección.
  • La clase creada debe ajustarse a la interfaz API recién creada. Podemos usar directamente el método de adaptación sin modificar directamente la clase original, por lo que la probabilidad de problemas es pequeña.
  • Compatibilidad de versiones, puede usar un adaptador para hacer que las versiones antiguas y nuevas coexistan.

Aviso

La diferencia entre el modo adaptador y el modo puente es que el adaptador se usa para conectar diferentes clases de interfaz. El patrón puente es un patrón que conecta la fase funcional y la fase de implementación.
La diferencia entre el patrón del adaptador y el patrón del decorador es que el adaptador llena el espacio entre las interfaces. El modo decorador es un modo en el que se pueden agregar nuevas funciones sin cambiar la interfaz.

Resumir

Permite la interacción entre interfaces incompatibles. El patrón Adapter se usa a menudo para resolver las diferencias entre las interfaces para que puedan trabajar juntas.

El patrón de adaptador funciona convirtiendo la interfaz de una clase en la interfaz de otra clase. La clase de adaptador implementa la interfaz de destino y contiene uno o más objetos de adaptador (implementación de adaptador).

La clase de adaptador implementa la interfaz de origen y proporciona los métodos y propiedades requeridos por la clase de adaptador.

En el patrón de adaptador, la clase de adaptador actúa como un puente entre dos interfaces diferentes, recibe el objeto de la interfaz de origen, lo convierte en la forma requerida por la interfaz de destino y luego lo pasa a la interfaz de destino para su procesamiento.

De esta forma se evita la refactorización y modificación del código por incompatibilidad de interfaz.

Supongo que te gusta

Origin blog.csdn.net/daohangtaiqian/article/details/130953655
Recomendado
Clasificación