Patrón de diseño_Patrón decorador

El artículo anterior trataba sobre el patrón proxy, y el artículo de hoy trata sobre un patrón de diseño que es muy similar a él: el patrón de decoración. enlace de modo proxy

Patrón decorador

El modo de decoración es un modo de diseño relativamente común. Diseñado para agregar dinámicamente responsabilidades adicionales a un objeto. Si es solo para agregar funcionalidad, el modo de decoración es más flexible que generar subclases.
El párrafo anterior ilustra un escenario, es decir, "agregar funciones", si cree que el objeto actual no puede satisfacer sus necesidades. Puedes considerar usar el modo decoración. Por ejemplo, todos los objetos del automóvil usan llaves para encenderse. Ahora que la demanda ha aumentado, la llave ya no se puede mostrar de manera elegante. Necesitamos actualizarla a la función de encendido por huella digital. En este caso, puede considerar usar el Modo decoración.

Diagrama de clases básico:
Escribe aquí la descripción de la imagen.
ICar: es nuestro objeto principal, la interfaz del automóvil/clase abstracta y el objeto más primitivo, que es equivalente al dibujo de un automóvil.
Coche: es la clase de implementación de la interfaz central y el objeto de implementación específico más original. Es esta clase la que necesitamos decorar. Es el equivalente a un coche de hormigón.
CarDecorate: la función de decoración, generalmente una clase abstracta, cuyo componente más importante es una variable privada ICar . ¿Por qué no es Car? ¿Estamos programando hacia interfaces?
CarDecorate A/B: Es la clase de implementación de decoración específica.
Esta es la clase básica y el diagrama de clases. Veamos algunos códigos específicos para implementarlo (consulte la implementación del código frente al diagrama de clases).

public interface ICar {
    public void fire();
}
public class Car implements ICar {
    
    

    @Override
    public void fire() {
        System.out.println("汽车钥匙点火了。。。");
    }

}
public abstract class CarDecorate implements ICar {
    
    

    private ICar icar = null;

    //通过构造函数,传递被修饰者
    public CarDecorate(ICar _icar){
        this.icar = _icar;
    }

    //委托给被修饰者执行方法
    @Override
    public void fire() {
        this.icar.fire();
    }

}
public class CarDecorateA extends CarDecorate{
    
    

    public CarDecorateA(ICar _icar) {
        super(_icar);
    }

    //定义自己的修饰方法
    private void keyFireA(){
        System.out.println("指纹A点火。。。");
    }

    //重写父类的fire方法
    public void fire(){
        this.keyFireA();
        super.fire();
    }
}
public class CarDecorateB extends CarDecorate{
    
    

    public CarDecorateB(ICar _icar) {
        super(_icar);
    }

    //定义自己的修饰方法
    private void keyFireB(){
        System.out.println("指纹B点火。。。");
    }

    //重写父类的fire方法
    public void fire(){
        this.keyFireB();
        super.fire();
    }
}
public class Client {
    public static void main(String args[]){
        ICar icar = new Car();

        //第一次修饰
        icar = new CarDecorateA(icar);

        //第二次修饰
        icar = new CarDecorateB(icar);

        icar.fire();
    }
}

Escenarios de uso del modo decoración:
1. Es necesario ampliar las funciones de una clase o agregar funciones adicionales a una clase.
2. Es necesario agregar y revocar dinámicamente una función. Es decir, puede agregar esta función cuando necesite usarla y puede cancelar esta función cuando no la necesite.
3. Es necesario modificar un lote de objetos; tome el ejemplo del automóvil anterior. Muchos automóviles ya están equipados con encendidos con llave en la fábrica, pero ahora van a modificarlos para que tengan encendidos con huellas dactilares y, obviamente, es inapropiado reescribirlos todos.

Supongo que te gusta

Origin blog.csdn.net/my_God_sky/article/details/52558396
Recomendado
Clasificación