java - patron - decorator pattern php
Diferencia entre el patrón de decorador y el patrón de delegación. (2)
Creo que ''Patrón de delegación'' fallaría en la prueba de fuego de lo que es o no es un patrón bastante claro. Por ejemplo, la gente todavía dice ''Conozco el patrón de fábrica'' todo el tiempo. No hay un patrón de fábrica. Esa es una expresión idiomática (cf. Advanced C ++ de James Coplien). Esa página es bastante débil también; No veo la simple delegación como una inversión de responsabilidad.
El decorador se utiliza cuando el código que se está decorando debe ser aumentado. El Decorador se envuelve alrededor del decorado y todavía llama a sus métodos, simplemente hace cosas antes o después. Esta es una de las razones por las que la gente habla mucho de Decorator cuando surgen los Aspectos: es un patrón que se basa en la intermediación, no en la cooperación, con su cohorte. (Esta es también la razón por la que en muchos casos, por ejemplo, cuando no tienes la fuente, debes usar un Decorador).
Decorator funciona mejor cuando quiere tomar algo que está funcionando y hacer que haga otra cosa, pero no cambiar la interfaz en absoluto. Imagina que tienes una clase de Repositorio que despliega una interfaz que tiene métodos CRUD. Ahora quieres añadir caché. Puede hacer un depósito en caché que decore el Repositorio y, al leerlo, busque en el caché, si no está allí, llamaría al método del repositorio regular; de lo contrario, solo puede devolver la copia en caché. No se modificó ningún código en la clase Repository y los usuarios de la clase no saben nada acerca del almacenamiento en caché.
¿Cuál es la diferencia entre el patrón de Decorator y el patrón de delegación (si hay alguno)? No quiero saber solo los detalles de implementación, sino también las diferencias de casos de uso y el punto de vista subjetivo sobre cómo usarlos.
EDITAR: ¿Puede señalar el código fuente (en el proyecto de SO) donde se usan estos patrones (especialmente la Delegación, porque se utiliza la Decoración en las clases de Java IO)? Estoy buscando un uso real, no solo un ejemplo ficticio. Tal vez estos patrones sean los mismos que difieren solo en el título. Siéntase libre de escribir esta opinión.
El decorador utiliza la delegación, pero de una manera muy específica.
La delegación (o composición) no es tanto un patrón como una forma general de construir un comportamiento complejo coordinando el uso de varios otros objetos. A menudo se usa de forma fija o estática. Por "conjunto o estático" me refiero a algo como esto:
class Delegator {
private final ClassA a = new ClassA();
private final ClassB b = new ClassB();
public void doWork() {
a.setup();
final ResFromA resa = a.getRes();
b.setup();
b.consume(resa);
}
}
Tenga en cuenta que Delegator no comparte ningún tipo ni interfaz con ClassA o ClassB, y conoce el tipo exacto de a y b.
Decorator es una forma dinámica de usar la delegación para agregar comportamiento a una entidad lógica en tiempo de ejecución. En Decorator, todas las entidades comparten una interfaz común y utilizan la delegación para concatenar su trabajo.
public interface Item {
public void drawAt(final int x, final int y);
}
public class CircleAround implements Item {
private final Item wrapped;
private final int radius;
public CircleAround(public final Item wrapped, public final int radius) {
this.wrapped = wrapped;
this.radius = radius;
}
public void drawAt(final int x, final int y) {
// First handle whatever we are wrapping
wrapped.drawAt(x,y);
// Then add our circle
Graphics.drawCircle(x, y, radius);
}
}
Tenga en cuenta que, a diferencia del primer ejemplo, CircleAround no conoce el tipo exacto del elemento que envuelve y comparte una interfaz común con él.