¿Cuál es la diferencia entre los patrones de diseño de Fachada, Proxy, Adaptador y Decorador?
Nunca he leído una explicación clara, ¿cuál es la tuya?
¿Cuál es la diferencia entre los patrones de diseño de Fachada, Proxy, Adaptador y Decorador?
Nunca he leído una explicación clara, ¿cuál es la tuya?
Respuestas:
El adaptador adapta una clase / objeto dado a una nueva interfaz. En el caso de la primera, típicamente se emplea la herencia múltiple. En el último caso, el objeto está envuelto por un objeto adaptador conforme y se pasa. El problema que estamos resolviendo aquí es el de las interfaces no compatibles .
Fachada es más como una simple puerta de entrada a un conjunto complicado de funcionalidades. Usted crea una caja negra para que sus clientes se preocupen menos, es decir, simplifiquen las interfaces .
Proxy proporciona la misma interfaz que la clase proxied-for y, por lo general, realiza algunas tareas de limpieza por su cuenta. (Entonces, en lugar de hacer múltiples copias de un objeto pesado, X
usted hace copias de un proxy ligero P
que a su vez administra X
y traduce sus llamadas según sea necesario). Está resolviendo el problema del cliente de tener que administrar un objeto pesado y / o complejo .
Decorator se utiliza para agregar más pólvora a sus objetos (tenga en cuenta el término objetos: normalmente decora objetos dinámicamente en tiempo de ejecución). No oculta / daña las interfaces existentes del objeto, sino que simplemente lo extiende en tiempo de ejecución .
Ahora que tiene un decorador involucrado, probablemente querrá saber por qué el énfasis en la palabra objeto: algunos lenguajes (como Java) simplemente no permiten la herencia virtual (es decir, la herencia múltiple como lo hace C ++) para permitirle lograr esto en tiempo de compilación.
Dado que hemos arrastrado múltiples herencias (y el temido diamante), buscará mixins , que se ordenan en cadena lineal de interfaces para evitar los problemas de herencia múltiple. Sin embargo, los mixins no se mezclan tan bien. Y terminamos con rasgos , sí, esos pequeños blobs de comportamiento sin estado que ves aparecer todo el tiempo en los parámetros de plantilla en C ++. Los rasgos intentan abordar los problemas de composición y descomposición de la conducta de una manera elegante sin recurrir a herencias múltiples ni al encadenamiento ordenado.
Fachada
Podría usar una fachada, por ejemplo, para hacer que las llamadas a una API sean más fáciles. Eche un vistazo a este ejemplo de fachada remota. La idea aquí es que la implementación completa del código en el servidor está oculta al cliente. El cliente llama a 1 método API que, a su vez, puede realizar 1 o más llamadas API en el servidor.
Adaptador
Un buen ejemplo de esto se puede encontrar aquí , en Wikipedia. Un objeto de cliente Source
desea llamar a un método en otro objeto Target
, pero la interfaz de ese otro objeto difiere de lo que el cliente espera.
Ingrese el objeto adaptador.
Puede recibir una llamada del Source
objeto y, detrás de escena, llamar al Target
método que debe usarse.
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
En cuanto a Proxy, no tengo ninguna experiencia con este patrón de diseño.