Estaba leyendo un artículo de programación y mencionaba el patrón Decorador. He estado programando durante un tiempo pero sin ningún tipo de educación o capacitación formal, pero estoy tratando de aprender sobre los patrones estándar y demás.
Entonces busqué el Decorador y encontré un artículo de Wikipedia sobre él. Ahora entiendo el concepto del patrón Decorador, pero este pasaje me confundió un poco:
Como ejemplo, considere una ventana en un sistema de ventanas. Para permitir el desplazamiento del contenido de la ventana, podemos agregarle barras de desplazamiento horizontales o verticales, según corresponda. Suponga que las ventanas están representadas por instancias de la clase Window, y suponga que esta clase no tiene funcionalidad para agregar barras de desplazamiento. Podríamos crear una subclase ScrollingWindow que los proporcione, o podríamos crear un ScrollingWindowDecorator que agregue esta funcionalidad a los objetos de Windows existentes. En este punto, cualquier solución estaría bien.
Ahora supongamos que también deseamos la posibilidad de agregar bordes a nuestras ventanas. Nuevamente, nuestra clase de ventana original no tiene soporte. La subclase ScrollingWindow ahora plantea un problema, porque efectivamente ha creado un nuevo tipo de ventana. Si deseamos agregar soporte de borde a todas las ventanas, debemos crear subclases WindowWithBorder y ScrollingWindowWithBorder. Obviamente, este problema empeora con cada nueva característica que se agrega. Para la solución de decorador, simplemente creamos un nuevo BorderedWindowDecorator; en tiempo de ejecución, podemos decorar ventanas existentes con ScrollingWindowDecorator o BorderedWindowDecorator o ambos, según lo creamos conveniente.
OK, cuando dicen agregar bordes a todas las ventanas, ¿por qué no simplemente agregar funcionalidad a la clase de ventana original para permitir la opción? A mi modo de ver, la subclasificación es solo para agregar una funcionalidad específica a una clase o anular un método de clase. Si necesito agregar funcionalidad a todos los objetos existentes, ¿por qué no modificaría la superclase para hacerlo?
Había otra línea en el artículo:
El patrón decorador es una alternativa a la subclase. La subclasificación agrega comportamiento en tiempo de compilación, y el cambio afecta a todas las instancias de la clase original; la decoración puede proporcionar un nuevo comportamiento en tiempo de ejecución para objetos individuales.
No entiendo donde dicen "... el cambio afecta a todas las instancias de la clase original": ¿cómo cambia la subclase la clase principal? ¿No es ese el objetivo de la subclase?
Asumiré que el artículo, como muchos Wiki, simplemente no está escrito claramente. Puedo ver la utilidad del Decorador en esa última línea: "... proporcionar un nuevo comportamiento en tiempo de ejecución para objetos individuales".
Sin haber leído sobre este patrón, si tuviera que cambiar el comportamiento en tiempo de ejecución para objetos individuales, probablemente habría incorporado algunos métodos en la superclase o subclase para habilitar / deshabilitar dicho comportamiento. Por favor, ayúdame a comprender realmente la utilidad del Decorador, y ¿por qué mi pensamiento de novato es erróneo?