Desmitificación del modo decorador: integré ChatGPT en el móvil con el decorador

En el proceso de desarrollo normal, a menudo nos encontramos con la necesidad de agregar funciones adicionales a una clase, pero no queremos destruir la estructura original de la clase. ¡En este momento, el modo decorador puede mostrar su poder! A continuación, lo llevaré a comprender el principio, las ventajas y desventajas del modo decorador, los escenarios aplicables y cómo usarlo hábilmente en el desarrollo real. Creo que después de leer este artículo, tendrá una comprensión más profunda del patrón decorador.

I. Resumen

Decorator Pattern (Patrón Decorator) es un patrón de diseño estructural que permite que un objeto agregue dinámicamente responsabilidades adicionales sin modificar la estructura de clases original. La clave de este patrón es reemplazar la relación de herencia con una relación de composición. Basado en la relación de composición, crea un objeto contenedor (decorador) para envolver el objeto original, mantiene el objeto original sin cambios e integra la extensión en el objeto decorador. . El patrón decorador es una mejor práctica del principio abierto-cerrado.

Por lo general, para seguir el principio de apertura y cierre, cuando extendemos la función de una clase, no modificaremos directamente la clase original, sino que integraremos la función extendida en la subclase por herencia. Sin embargo, la herencia tiene características estáticas y un alto grado de acoplamiento, y con el aumento de funciones extendidas, las subclases se expandirán. Si no queremos extender la clase sin agregar muchas subclases, podemos usar la relación de composición en lugar de la relación de herencia, que puede proporcionar una expansión más flexible que la herencia.

Además, el objeto decorador y el objeto original generalmente implementan la misma interfaz, lo que tiene dos ventajas. Primero, el cliente no necesita distinguir entre el objeto decorador y el objeto decorado, y acceder a ellos de manera unificada. En segundo lugar, la capa exterior del objeto decorador se puede cubrir con otra capa de decoradores para realizar la combinación de las funciones de los dos decoradores, lo que significa que los decoradores se pueden anidar en varias capas para lograr combinaciones de funciones más complejas.
decorador02
El patrón decorador incluye principalmente los siguientes roles:

  1. Componente abstracto (Component): interfaz o clase abstracta, que define el comportamiento abstracto de la entidad, y los siguientes componentes y decoradores concretos deben implementar esta interfaz.
  2. ConcreteComponent (ConcreteComponent): clase de entidad, clase empaquetada, realiza un componente abstracto y representa el objeto que se va a decorar.
  3. Decorador abstracto (Decorator): generalmente una clase abstracta que contiene una referencia a un componente abstracto e implementa un componente abstracto. Todos los decoradores concretos deben heredar de este decorador abstracto.
  4. Decorador concreto (ConcreteDecorator): heredado del decorador abstracto, cada nueva función de extensión corresponde a un decorador concreto, y los decoradores concretos se pueden anidar entre sí.

ventaja

  • Ampliar dinámicamente las funciones de los objetos: el patrón Decorator sigue el principio de abrir y cerrar, lo que permite agregar dinámicamente nuevas funciones a los objetos sin modificar la clase original.
  • Garantice la coherencia de la interfaz: el objeto decorador utiliza la misma interfaz que el objeto decorado, lo que garantiza la coherencia de la interfaz y hace que las llamadas de los clientes sean más concisas.
  • Control de funcionalidad detallado: el patrón Decorator permite un control detallado sobre la funcionalidad de un objeto. Puede elegir agregar diferentes decoradores según sea necesario para combinar combinaciones funcionales que satisfagan necesidades específicas, sin crear una subclase independiente para cada combinación funcional.
  • Soporte para combinación anidada de decoradores: el patrón de decorador admite el uso anidado de múltiples decoradores, que se pueden combinar en un orden determinado para lograr extensiones de funciones más complejas. A través de combinaciones anidadas, se pueden construir de manera flexible combinaciones funcionales que satisfagan necesidades específicas.

defecto

  • Mayor complejidad: la introducción del patrón decorador agregará clases y objetos adicionales, lo que aumentará la complejidad del sistema. Si el patrón de decorador se usa en exceso, puede conducir a un nivel de decorador demasiado profundo, lo que dificulta la comprensión y el mantenimiento del código.
  • Impacto potencial en el rendimiento: cada decorador debe envolver el objeto decorado y agregarle una funcionalidad adicional. Esto puede provocar cierta degradación del rendimiento en el manejo de objetos, especialmente cuando hay muchas capas de decoradores.

escena aplicable

  • Existe la necesidad de ampliar dinámicamente la funcionalidad de los objetos existentes sin modificar su código.

  • Se deben proporcionar diferentes extensiones de función para un objeto, y estas extensiones de función se pueden combinar arbitrariamente.

  • Se requiere la capacidad de agregar, eliminar o modificar objetos dinámicamente en tiempo de ejecución.

  • Es necesario mantener la coherencia de la interfaz para que el código del cliente pueda tratar de forma transparente con el objeto decorado y el objeto decorador.

  • Cuando no es posible o conveniente utilizar la herencia para ampliar la funcionalidad del objeto, el patrón decorador proporciona una alternativa más flexible.

En segundo lugar, la realización del caso.

analisis de CASO

Hay un fabricante de teléfonos móviles que actualmente produce dos tipos de teléfonos móviles, uno son los teléfonos móviles Huawei y el otro son los teléfonos móviles Xiaomi, ambos implementan la interfaz Phone, que define un método ican para mostrar las funciones básicas de los teléfonos móviles actuales, incluyendo SMS, teléfono, 4G, centro comercial, etc. Ahora necesitamos expandir dos nuevas funciones, una es expandir la función 5G y la otra es integrar la función ChatGPT. En el futuro, los teléfonos móviles Huawei o Xiaomi que producimos pueden integrar una de estas funciones o pueden integrar ambas funciones. Para tal escenario, somos muy adecuados para usar el patrón decorador para lograrlo.

Código

Paso 1 : crear componentes abstractos y componentes concretos

public interface Phone {
    
    
    void ican();
}
public class HuaWeiPhone implements Phone{
    
    
    @Override
    public void ican() {
    
    
        System.out.println("huawei capacities:call,sms,4G,huaweiStore");
    }
}
public class XiaoMiPhone implements Phone{
    
    
    @Override
    public void ican() {
    
    
        System.out.println("xiaomi capacities:call,sms,4G,xiaomiStore");
    }
}

Paso 2 : cree un decorador abstracto que necesite implementar la interfaz del teléfono y envuelva el objeto de tipo teléfono dentro.

public abstract class PhoneDecorator implements Phone{
    
    
    protected Phone phone;

    public PhoneDecorator(Phone phone) {
    
    
        this.phone = phone;
    }
    public void ican(){
    
    
        phone.ican();
    }

}

Paso 3 : Crear un decorador específico----decorador 5G

public class Phone5GDecorator extends PhoneDecorator {
    
    

    public Phone5GDecorator(Phone phone) {
    
    
        super(phone);
    }

    private void add5G() {
    
    
        System.out.println("extended capacity: 5G");
    }

    @Override
    public void ican() {
    
    
        phone.ican();
        add5G();
    }
}

Paso 4 : Crea un decorador específico----Ai decorador

public class PhoneAiDecorator extends PhoneDecorator{
    
    

    public PhoneAiDecorator(Phone phone) {
    
    
        super(phone);
    }
    private void addAi() {
    
    
        System.out.println("extended capacity: chatGPT");
    }

    @Override
    public void ican() {
    
    
        phone.ican();
        addAi();
    }
}

Paso 5 : prueba del cliente

public class Client {
    
    
    public static void main(String[] args) {
    
    
        //以华为手机为例进行功能扩展
        System.out.println("华为手机:");
        Phone huawei=new HuaWeiPhone();
        huawei.ican();
        System.out.println();

        System.out.println("华为5G手机:");
        PhoneDecorator huawei5G=new Phone5GDecorator(new HuaWeiPhone());
        huawei5G.ican();
        System.out.println();

        System.out.println("集成ChatGPT的华为5G手机:");
        PhoneDecorator huaWeiAi=new PhoneAiDecorator(huawei5G);
        huaWeiAi.ican();
    }
}

Resultados de la prueba
imagen-20230531111937128

tres, resumen

Este artículo presenta el principio y la aplicación del modo decorador en detalle, y ayuda a todos a comprender el modo decorador en profundidad al simular el caso de la extensión de la función del teléfono móvil. Este es un patrón de diseño muy práctico, que agrega dinámicamente nuevas funciones a la clase original a través de la composición en lugar de la herencia. La combinación puede hacer que la extensión de la clase sea más flexible y modificable y, al mismo tiempo, evitar el problema de la expansión de la subclase causada por la herencia. Espero que todos puedan descubrir y usar mejor el patrón decorador en el desarrollo real en el futuro, y puedan sacar inferencias de una instancia para hacer que su código sea más elegante.

Gracias por leer, espero que este artículo pueda ser útil para usted, si le gusta este artículo, ¡no olvide dar me gusta y seguir!

1711edbd2bd444b1b647e09c2c3aff0d

Supongo que te gusta

Origin blog.csdn.net/qq_36756227/article/details/130958887
Recomendado
Clasificación