Patrón de diseño 7: patrón de decorador

¿Qué problema resuelve el patrón decorador?

La declaración oficial: el patrón Decorator (Patrón Decorator) permite agregar una nueva funcionalidad a un objeto existente sin cambiar su estructura.

Comprensión personal: la interfaz original tiene funciones insuficientes y es necesario agregar nuevos métodos, pero la interfaz original se implementó en otro lugar, por lo que la interfaz original no puede agregar métodos directamente. En este momento, puede implementar nuevas funciones manteniendo el objeto de clase original y agregando nuevos métodos. Y herede la clase original o implemente la interfaz original para lograr el propósito de reemplazar la clase original.

¿Cuáles son las aplicaciones prácticas del patrón decorador en el JDK?

FilterInputStream
InputStream es una clase abstracta, código fuente:

public abstract class InputStream implements Closeable {
    
    
    ...
    public abstract int read() throws IOException;    
    ...
}

Código fuente de InputFilterStream:

public
class FilterInputStream extends InputStream {
    
    

    protected volatile InputStream in;
    ...

    public int read() throws IOException {
    
    
        return in.read();
    }
	...
}

Código fuente de BufferedInputStream:

public
class BufferedInputStream extends FilterInputStream {
    
    

    public BufferedInputStream(InputStream in) {
    
    
        this(in, DEFAULT_BUFFER_SIZE);
    }
    
    public BufferedInputStream(InputStream in, int size) {
    
    
        super(in); //注意这里调用了FilterInputStream的构造器
        if (size <= 0) {
    
    
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }

    public synchronized int read() throws IOException {
    
    
        if (pos >= count) {
    
    
            fill();
            if (pos >= count)
                return -1;
        }
        return getBufIfOpen()[pos++] & 0xff;
    }

	...

    private InputStream getInIfOpen() throws IOException {
    
    
        InputStream input = in;
        if (input == null)
            throw new IOException("Stream closed");
        return input;
    }

	...
	
}

Métodos completos de tres clases:
InputStream es una clase abstracta con un solo método abstracto.

FilterInputStream no agrega métodos, solo contiene una instancia de InputStream.

BufferedInputStream agrega varios métodos, por ejemplo: getInIfOpen().

Utilice BufferedInputStream:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("/home/user/abc.txt")));

Flujos y patrones de diseño en Java IO

¿Cuáles son las aplicaciones prácticas del patrón decorador en el SDK de Android?

¿Cuál es la diferencia entre el patrón decorador y el patrón adaptador?

En pocas palabras: el patrón decorador resuelve el problema de la funcionalidad insuficiente de la clase original. El patrón adaptador resuelve el problema de que la clase original tiene esta función, pero la función no coincide.
Por ejemplo, la clase original tiene pantalones, pero no zapatos. En este momento, se usa el modo decorador. La clase original tiene zapatos, pero el tamaño de los zapatos es demasiado grande para caber. En este momento, se usa el modo adaptador.

Patrón decorador:

  • El propósito del patrón Decorator es agregar dinámicamente una nueva funcionalidad al objeto de clase original. Resuelva el problema de la funcionalidad insuficiente de la clase original.
  • Las clases de decorador actúan como mejoras funcionales.
  • Herede la clase original, cree una clase de decorador, envuelva el objeto de clase original en el decorador y agregue funciones de forma combinada.

Modo adaptador:

  • El propósito del patrón de adaptador (patrón de adaptador) es lograr la interfaz de destino, para resolver la función de clase original no coincide con el problema. Haga que la interfaz de destino interactúe con la clase original.
  • La clase de adaptador actúa como un puente.
  • El patrón de adaptador implementa los métodos de la interfaz de destino mediante la creación de una clase de adaptador que coopera con los métodos de la clase original.

¿Cuál es la diferencia entre el patrón decorador y el patrón proxy?

  • El propósito es diferente: el patrón decorador es extender las funciones del objeto original y agregar nuevos métodos al decorador. El modo proxy es para controlar el acceso del objeto original, y se modifica el método del objeto original.
  • El número de métodos es diferente: en el patrón de decorador, el número de métodos del decorador es mayor que el de la persona que se está decorando, porque es necesario agregar nuevos métodos. El modo proxy generalmente tiene la misma cantidad de métodos que la clase principal.
  • El modificador de acceso del objeto original es diferente: en el modo decorador, el modificador de acceso del objeto original generalmente esprotected

Supongo que te gusta

Origin blog.csdn.net/zhangjin1120/article/details/131571362
Recomendado
Clasificación