Padrões de design Java: padrão decorador

padrão de decorador

definição:

Com base em não alterar o objeto original, adicione a função ao objeto.

O modo decorador pode adicionar dinamicamente algumas responsabilidades adicionais ao objeto para alcançar a expansão funcional e selecionar diferentes decoradores em tempo de execução para obter comportamentos diferentes; é mais flexível do que usar herança. Ao organizar e combinar diferentes classes de decoração, muitos comportamentos diferentes podem ser criados. obtido para obter objetos com funções mais poderosas; de acordo com o "princípio de abertura e fechamento", a classe decorada e a classe decorada mudam independentemente. Os usuários podem adicionar novas classes decoradas e classes decoradas de acordo com suas necessidades e, em seguida, modificá-las ao usar combinação, o código original não precisa ser alterado.

Cenário de aplicação:

Estenda a funcionalidade de uma classe ou atribua responsabilidades a uma classe.

Quando é necessário expandir as funções de uma classe, geralmente pode-se usar herança, mas se houver muitos tipos de funções que precisam ser expandidas, inevitavelmente gerará muitas subclasses, aumentando a complexidade do sistema, e ao usar herança para conseguir a expansão da função, devemos ser capazes de prever essas funções estendidas, ou seja, essas funções precisam ser determinadas em tempo de compilação. Então, existe uma maneira melhor de conseguir a expansão funcional? A resposta é o padrão decorador.

vantagem:

1) Estenda novas funções sem alterar o objeto original.
2) Usar combinações diferentes pode obter efeitos diferentes.
3) Cumprir o princípio de abertura e fechamento.

Exemplo de código:

Componente: O componente abstrato serve para definir uma interface de objeto, que pode adicionar dinamicamente responsabilidades a este objeto.

ConcreteComponent: Um componente concreto define um objeto específico e também pode adicionar algumas responsabilidades a este objeto.

Decorator: Classe de decoração abstrata, herdada de Component, para estender a função da classe Component da classe externa, mas para Component não é necessário saber a existência do Decorator.

ConcreteDecorator: Uma classe de decoração específica que funciona para adicionar responsabilidades ao Component.

package com.test;

public class DecoratorMode {
    
    
    public static void main(String[] args) {
    
    
        // 使用相机拍照功能
        Component component = new ConcreteComponent();
        component.camera();
        // 使用相机的拍照和美颜功能
        component = new ConcreteDecorator(new ConcreteComponent());
        component.camera();
        // 使用相机的拍照、美颜和滤镜功能
        component = new ConcreteDecorator1(new ConcreteDecorator(new ConcreteComponent()));
        component.camera();
    }
}

// 定义被装饰者,以手机相机为例
interface Component{
    
    
    void camera();
}

// 最原始只有拍照功能
class ConcreteComponent implements Component{
    
    
    public void camera() {
    
    
        System.out.println("拍照功能...");
    }
}

abstract class Decorator implements Component{
    
    

    Component component;

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


// 添加美颜功能
class ConcreteDecorator extends Decorator{
    
    

    public ConcreteDecorator(Component component) {
    
    
        super(component);
    }

    public void camera() {
    
    
        // 调用原始方法
        component.camera();
        System.out.println("美颜功能...");
    }
}

// 添加滤镜功能
class ConcreteDecorator1 extends Decorator{
    
    

    public ConcreteDecorator1(Component component) {
    
    
        super(component);
    }

    public void camera() {
    
    
        // 调用原始方法
        component.camera();
        System.out.println("滤镜功能...");
    }
}

Acho que você gosta

Origin blog.csdn.net/qq_40042416/article/details/128985893
Recomendado
Clasificación