concepto
Patrón de decorador (Patrón de decorador), también conocido como Patrón de envoltura (Patrón de envoltura) se refiere a la adición de funciones a los objetos sin cambiar los objetos originales. Este tipo de patrón de diseño pertenece al patrón estructural, que sirve como envoltorio para las clases existentes.
El patrón de decorador incluye principalmente cuatro roles:
- Componente abstracto (Componente) : Puede ser una interfaz o clase abstracta, que actúa como el objeto original de la clase decorada y especifica el comportamiento del objeto decorado.
- Componente de hormigón (ConcreteComponent) : un objeto de hormigón que implementa o hereda Component, que es el objeto decorado
- Decorador abstracto (Decorador) : un decorador general que decora ConcreteComponent. Debe haber una propiedad en él que apunte al componente abstracto Component
- Decorador de hormigón (ConcreteDecorator) : la clase de implementación de hormigón de Decorator
lograr
Tomemos el pastel, el huevo y el jamón como ejemplo:
1. Crea componentes abstractos
public abstract class Pancake {
abstract String name();
}
2. Crea componentes específicos
public class BasePancake extends Pancake {
@Override
String name() {
return "素煎饼";
}
}
3. Crea un decorador abstracto
public abstract class PancakeDecorator extends Pancake{
private Pancake pancake;
public PancakeDecorator(Pancake pancake) {
this.pancake = pancake;
}
String name(){
return this.pancake.name();
}
}
4. Crea un decorador de hormigón
public class EggDecorator extends PancakeDecorator {
public EggDecorator(Pancake pancake) {
super(pancake);
}
String name(){
return super.name()+"+鸡蛋";
}
}
public class SausageDecorator extends PancakeDecorator {
public SausageDecorator(Pancake pancake) {
super(pancake);
}
String name(){
return super.name()+"+火腿肠";
}
}
5. Prueba
public class DecoratorTest {
public static void main(String[] args) {
Pancake pancake=new BasePancake();
//加鸡蛋
pancake=new EggDecorator(pancake);
//再加鸡蛋
pancake=new EggDecorator(pancake);
//再加香肠
pancake=new SausageDecorator(pancake);
System.out.println(pancake.name());
}
}
resultado de la operación:
escenas que se utilizarán
- Amplíe la funcionalidad de una clase
- Función de aumento dinámico, cancelación dinámica
Usar en código fuente
En el código fuente de Mybatis que mencionamos anteriormente, hay una interfaz de caché Cache:
se puede entender por el nombre, por ejemplo, FifoCache es un caché de primero en entrar, primero en salir, BlockingCache es un caché de bloqueo, etc., todos adoptan el modo decorador
La diferencia entre el modo decorador y el modo proxy
- El decorador enfatiza la expansión de sus propias funciones, y el modo agente enfatiza el control del proceso del agente.
para resumir
ventaja
- Se pueden lograr diferentes efectos utilizando diferentes decoraciones y la permutación y combinación de estas decoraciones.
- Extienda dinámicamente funciones a un objeto sin cambiar el objeto original
Desventaja
- Será más complicado cuando la decoración de múltiples capas.