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("滤镜功能...");
}
}