Pequeña charla sobre patrones de diseño (7)—Patrón de decoración

Introducción a la columna

Dirección de columna

enlace

Introducción a la columna

Principalmente analiza y resume uno por uno los 23 patrones de diseño comunes actualmente en el mercado, espero que los amigos interesados ​​puedan echarle un vistazo y se actualizará continuamente. Espero que puedan supervisarme y podamos aprender y progresar juntos, vamos todos.
Insertar descripción de la imagen aquí

Modo decorativo

Decorator Pattern es un patrón de diseño estructural que le permite agregar dinámicamente funcionalidad adicional a un objeto sin modificar su clase original. Al envolver un objeto en una clase decoradora, puede agregar funcionalidad de forma incremental sin cambiar la estructura del objeto existente.

Personaje del modo decoración.

Insertar descripción de la imagen aquí

Componente (componente abstracto)

Define la interfaz común de componentes y decoradores concretos, que puede ser una clase o interfaz abstracta.

ConcreteComponent (componente de hormigón)

La interfaz definida por el componente abstracto se implementa y es el objeto original decorado.

Decorador (decorador abstracto)

Contiene una referencia a un componente concreto e implementa la interfaz definida por el componente abstracto.

ConcreteDecorator (decorador de hormigón)

Utilice decoradores para ampliar o modificar componentes específicos para agregar funcionalidad adicional.

Insertar descripción de la imagen aquí

Proceso de trabajo

primero

Defina un componente abstracto (Componente), que declare los métodos de interfaz comunes a componentes y decoradores concretos.

En segundo lugar

Cree un componente concreto (ConcreteComponent), que implemente el método de interfaz del componente abstracto y sea el objeto original decorado.

Entonces

Cree un decorador abstracto (Decorator), que también implementa el método de interfaz del componente abstracto y contiene una variable miembro que apunta a un componente específico (generalmente un tipo de componente abstracto) para contener el objeto decorado.

por fin

Cree un decorador concreto (ConcreteDecorator), que hereda del decorador abstracto y agrega funciones adicionales basadas en el decorador. Los decoradores concretos generalmente anulan los métodos de interfaz de los componentes abstractos para realizar procesamiento adicional antes y después de la llamada, y luego llaman al método correspondiente del objeto decorado.
Insertar descripción de la imagen aquí

Implementación de código Java

// Step 1: 定义抽象组件
interface Component {
    
    
    void operation();
}

// Step 2: 创建具体组件
class ConcreteComponent implements Component {
    
    
    public void operation() {
    
    
        System.out.println("执行具体组件的操作");
    }
}

// Step 3: 创建抽象装饰器
abstract class Decorator implements Component {
    
    
    protected Component component;

    public Decorator(Component component) {
    
    
        this.component = component;
    }

    public void operation() {
    
    
        component.operation();
    }
}

// Step 4: 创建具体装饰器
class ConcreteDecorator extends Decorator {
    
    
    public ConcreteDecorator(Component component) {
    
    
        super(component);
    }

    public void operation() {
    
    
        // 在调用具体组件操作前进行额外处理
        System.out.println("在调用具体组件操作前进行额外处理");

        // 调用具体组件的操作
        super.operation();

        // 在调用具体组件操作后进行额外处理
        System.out.println("在调用具体组件操作后进行额外处理");
    }
}

// 使用装饰模式
public class Main {
    
    
    public static void main(String[] args) {
    
    
        // 创建具体组件对象
        Component component = new ConcreteComponent();

        // 创建具体装饰器对象,并将具体组件对象传入
        Component decorator = new ConcreteDecorator(component);

        // 调用装饰后的操作
        decorator.operation();
    }
}

análisis de código

Component es una interfaz de componente abstracto y ConcreteComponent es una clase de componente concreto que implementa los métodos de la interfaz de componente abstracto. Decorator es una clase decoradora abstracta que implementa la interfaz del componente abstracto y contiene una variable miembro del tipo de componente abstracto. ConcreteDecorator es una clase decoradora concreta, que hereda de la clase decoradora abstracta, anula el método de operación y agrega procesamiento adicional antes y después de la llamada.

En la función principal, primero cree el objeto de componente concreto ConcreteComponent, luego páselo al constructor del objeto decorador de concreto ConcreteDecorator y use el decorador para envolver el componente de concreto. Finalmente, cuando se llama a la operación decorada, el procesamiento adicional y las operaciones de componentes específicos se realizarán en un orden determinado.

Análisis de ventajas y desventajas

ventaja

Cumplir con el principio de apertura y cierre.

Puede ampliar la funcionalidad de un objeto agregando una nueva clase decoradora sin modificar el código existente.

Las características se pueden agregar/eliminar dinámicamente

Puede agregar o eliminar dinámicamente funciones de objetos según sea necesario y combinar diferentes decoradores para lograr diferentes combinaciones de comportamiento.

Seguir el principio de responsabilidad única

Las clases de componentes específicas solo son responsables de las funciones principales, y las clases de decoradores específicas solo se centran en funciones adicionales. Cada clase tiene responsabilidades claras y una alta capacidad de mantenimiento.

La clase decoradora es independiente de la clase de componente concreto.

La relación entre la clase de decorador y la clase de componente específica está débilmente acoplada y se puede cambiar de forma independiente. Agregar o eliminar decoradores no afectará el comportamiento de otros componentes.

defecto

Puede producir demasiadas clases de decoradores concretos.

Si hay muchas funciones en el sistema que deben expandirse, puede resultar en una gran cantidad de clases de decoradores específicas, lo que aumenta la complejidad del sistema.

La interfaz entre el decorador y la clase de componente es inconsistente

En el patrón decorador, las interfaces de la clase decoradora y la clase de componente específica son inconsistentes, lo que hace que el cliente necesite diferenciar entre llamadas.
Insertar descripción de la imagen aquí

Resumir

El patrón de decoración proporciona una forma flexible y extensible de modificar la funcionalidad de un objeto manteniendo al mismo tiempo una interfaz simple y facilidad de mantenimiento del código. Pero es necesario equilibrar la complejidad de la extensión y la coherencia de la interfaz del objeto.

Supongo que te gusta

Origin blog.csdn.net/weixin_74888502/article/details/133437213
Recomendado
Clasificación