software pattern patrones patron orientado objetos ejemplos diseño design-patterns proxy adapter decorator facade

design patterns - pattern - ¿Diferencia entre los patrones de diseño Fachada, Proxy, Adaptador y Decorador?



patrones de diseño java (2)

¿Cuál es la diferencia entre los patrones de diseño Fachada, Proxy, Adaptador y Decorador?

Nunca he leído una explicación clara, ¿cuál es la tuya?


El adaptador adapta una clase / objeto dado a una nueva interfaz. En el caso de los primeros, la herencia múltiple generalmente se emplea. En este ú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 .

Facade es más como una entrada simple a un complejo conjunto 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, hace algunas cosas de housekeeping por sí misma. (Por lo tanto, en lugar de hacer copias múltiples de un objeto pesado X usted hace copias de un proxy P liviano que a su vez administra X y traduce sus llamadas según sea necesario). Está resolviendo el problema de que el cliente tenga que gestionar una carga pesada y / o objeto complejo .

El decorador se usa para agregar más pólvora a sus objetos (observe el término objetos: normalmente decora los objetos dinámicamente en el tiempo de ejecución). No oculta / deteriora las interfaces existentes del objeto sino que simplemente lo extiende en tiempo de ejecución .

Ahora que tiene 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.

Como hemos arrastrado en múltiples herencias (y en el temido diamante), buscará mixinas , que son cadenas ordenadas de interfaces para evitar los problemas de la herencia múltiple. Sin embargo, las mixinas no se mezclan tan bien. Y terminamos con rasgos , sí, esos pequeños patrones de comportamiento sin estado que ves aparecer todo el tiempo en los parámetros de la plantilla en C ++. Los rasgos intentan abordar los problemas de composición y descomposición de la conducta de una manera elegante, mientras que no va para herencias múltiples o encadenamiento ordenado.


Fachada

Podría usar una fachada, por ejemplo, para hacer llamadas a una API más fácil. Eche un vistazo a this ejemplo de una fachada remota. La idea aquí es que la implementación completa del código en el servidor está oculta del cliente. El cliente llama a 1 método de API que, a su vez, puede hacer 1 o más llamadas de API en el servidor.

Adaptador

Un buen ejemplo de esto se puede encontrar here , en Wikipedia. Una Source objeto cliente desea llamar a un método en otro objeto Target , pero la interfaz de ese otro objeto es diferente a la que espera el cliente.

Ingrese el objeto adaptador

Puede recibir una llamada del objeto Source y, detrás de escena, llamar al método Target que se debe usar.

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.