Saltar al contenido

Casos de uso y ejemplos del patrón GoF Decorator para IO

Posterior a investigar en diversos repositorios y sitios webs de internet al concluir hallamos la respuesta que te compartiremos pronto.

Solución:

InputStream es una clase abstracta. La mayoría de las implementaciones concretas como BufferedInputStream, GzipInputStream, ObjectInputStream, etc. tienen un constructor que toma una instancia del mismo clase abstracta. ese es el reconocimiento key del patrón decorador (esto también se aplica a los constructores que toman una instancia de la misma interfaz).

Cuando se usa un constructor de este tipo, todos los métodos se delegarán a la instancia envuelta, con cambios en la forma en que se comportan los métodos. Por ejemplo, almacenar en búfer la secuencia en la memoria de antemano, descomprimir la secuencia de antemano o interpretar la secuencia de manera diferente. Algunos incluso tienen métodos adicionales que finalmente también delegan más a la instancia envuelta. Esos métodos decoran la instancia envuelta con un comportamiento adicional.

Digamos que tenemos un montón de objetos Java serializados en un archivo comprimido con Gzip y queremos leerlos rápidamente.

Primero abra un flujo de entrada de él:

FileInputStream fis = new FileInputStream("/objects.gz");

Queremos velocidad, así que almacenémosla en la memoria:

BufferedInputStream bis = new BufferedInputStream(fis);

El archivo está comprimido con gzip, por lo que debemos descomprimirlo:

GzipInputStream gis = new GzipInputStream(bis);

Necesitamos deserializar esos objetos Java:

ObjectInputStream ois = new ObjectInputStream(gis);

Ahora finalmente podemos usarlo:

SomeObject someObject = (SomeObject) ois.readObject();
// ...

El beneficio es que tiene mucha libertad para decorar la transmisión usando uno o más decoradores diferentes para satisfacer sus necesidades. Eso es mucho mejor que tener una sola clase para cada combinación posible como ObjectGzipBufferedFileInputStream, ObjectBufferedFileInputStream, GzipBufferedFileInputStream, ObjectGzipFileInputStream, ObjectFileInputStream, GzipFileInputStream, BufferedFileInputStream, etc

Tenga en cuenta que cuando esté a punto de cerrar la transmisión, simplemente cierre el más exterior decorador es suficiente. Delegará la llamada cercana hasta el fondo.

ois.close();

Ver también:

  • Ejemplos de patrones de diseño de GoF en las bibliotecas principales de Java

Entendamos los componentes de Decorador patrón antes de pasar por las clases de Java IO.

ingrese la descripción de la imagen aquí

El patrón Decorator tiene cuatro componentes.

  1. Componente: El Componente define la interfaz para los objetos que pueden tener responsabilidades agregadas dinámicamente
  2. Componente de hormigón: Es simplemente una implementación de Componente interfaz
  3. Decorador: El Decorador tiene una referencia a un Componente, y también se ajusta a la Componente interfaz. Decorator es esencialmente envolver el Componente
  4. Decorador de Concreto: El ConcretoDecorador solo agrega responsabilidades al original Componente.

El patrón decorador se puede utilizar para ampliar (decorar) la funcionalidad de un determinado objeto de forma estática o, en algunos casos, en tiempo de ejecución, independientemente de otras instancias de la misma clase, siempre que se realicen algunos trabajos preliminares en el momento del diseño. Esto se logra mediante el diseño de un nuevo Decorador clase que envuelve la clase original.

Ahora vamos a asignar estos conceptos a las clases de paquetes de java.io.

Componente:

Flujo de entrada :

Esta clase abstracta es la superclase de todas las clases que representan un flujo de entrada de bytes.

Las aplicaciones que necesitan definir una subclase de InputStream siempre deben proporcionar un método que devuelva el siguiente byte de entrada.

public abstract int read() es un método abstracto.

Componente de hormigón:

Flujo de entrada de archivo:

Un FileInputStream obtiene bytes de entrada de un archivo en un sistema de archivos. Los archivos que están disponibles dependen del entorno del host.

FileInputStream está diseñado para leer flujos de bytes sin procesar, como datos de imágenes. Para leer flujos de caracteres, considere usar FileReader.

Ejemplos de todos los ConcreteComponents de InputStream:

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, 
InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, 
StringBufferInputStream

Decorador:

Flujo de entrada de filtro:

Un FilterInputStream contiene algún otro flujo de entrada, que utiliza como su fuente básica de datos, posiblemente transformando los datos en el camino o proporcionando funcionalidad adicional.

Tenga en cuenta que FilterInputStream implementos InputStream => El decorador implementa el componente como se muestra en el diagrama UML.

public class FilterInputStream
extends InputStream

Decorador de Concreto:

BufferedInputStream

Un BufferedInputStream agrega funcionalidad a otro flujo de entrada, a saber, la capacidad de almacenar en búfer la entrada y admitir los métodos de marcar y restablecer.

Ejemplos de todos ConcretoDecoradores:

BufferedInputStream, CheckedInputStream, CipherInputStream, DataInputStream, 
DeflaterInputStream, DigestInputStream, InflaterInputStream, 
LineNumberInputStream, ProgressMonitorInputStream, PushbackInputStream

código de ejemplo de trabajo:

He usado BufferedInputStream para leer cada carácter de una palabra, que se ha almacenado en un archivo de texto a.txt

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("a.txt")));
while(bis.available()>0)

        char c = (char)bis.read();
        System.out.println("Char: "+c);;

Cuándo usar este patrón:

  1. Las responsabilidades y los comportamientos de los objetos deben agregarse o eliminarse dinámicamente
  2. Las implementaciones concretas deben desvincularse de las responsabilidades y los comportamientos.
  3. Cuando la subclasificación es demasiado costosa para agregar/eliminar responsabilidades dinámicamente

En .NET, hay un montón de decoradores de flujo, como BufferedStream, CryptoStream, GzipStream, etc. Todos esos decoran Stream clase.

Calificaciones y comentarios

Si posees alguna duda y forma de innovar nuestro reseña puedes ejecutar una explicación y con deseo lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *