Patrón de fachada

Ajustar Compartir Imprimir Citar
Diseño de software

El patrón de fachada (también escrito fachada) es un patrón de diseño de software comúnmente utilizado en la programación orientada a objetos. De manera análoga a una fachada en arquitectura, una fachada es un objeto que sirve como una interfaz frontal que enmascara un código subyacente o estructural más complejo. Una fachada puede:

Los desarrolladores suelen utilizar el patrón de diseño de fachada cuando un sistema es muy complejo o difícil de entender porque el sistema tiene muchas clases interdependientes o porque su código fuente no está disponible. Este patrón oculta las complejidades del sistema más grande y proporciona una interfaz más sencilla para el cliente. Por lo general, implica una sola clase contenedora que contiene un conjunto de miembros requeridos por el cliente. Estos miembros acceden al sistema en nombre del cliente de fachada y ocultan los detalles de implementación.

Resumen

La fachada patrón de diseño es uno de los veintitrés bien conocidos Patrones de diseño de GoF que describen cómo resolver problemas de diseño recurrentes para diseñar software orientado a objetos flexible y reutilizable, es decir, objetos que son más fáciles de implementar, cambiar, probar y reutilizar.

¿Qué problemas puede resolver el patrón de diseño Facade?

Los clientes que acceden a un subsistema complejo se refieren directamente (dependen de) muchos objetos diferentes que tienen diferentes interfaces (acoplamiento estrecho), lo que hace que los clientes sean difíciles de implementar, cambiar, probar y reutilizar.

¿Qué solución describe el patrón de diseño Fachada?

Defina un objeto Fachada que

Esto permite trabajar a través de un objeto Facade para minimizar las dependencias en un subsistema.
Vea también la clase UML y el diagrama de secuencia a continuación.

Uso

Una Fachada se usa cuando se desea una interfaz más fácil o simple para un objeto subyacente. Alternativamente, se puede usar un adaptador cuando el contenedor debe respetar una interfaz particular y debe admitir un comportamiento polimórfico. Un decorador hace posible agregar o modificar el comportamiento de una interfaz en tiempo de ejecución.

PatrónIntent
AdaptadorConvierte una interfaz a otra para que coincida con lo que el cliente espera
DecoradorAgrega dinámicamente la responsabilidad a la interfaz envolviendo el código original
FacadeProporciona una interfaz simplificada

El patrón de fachada se usa típicamente cuando

Estructura

Clase UML y diagrama de secuencia

Facade Design Pattern Class Diagram
Facade Design Pattern Sequence Diagram
Un diagrama de clase y secuencia UML muestra para el patrón de diseño Facade.

En este diagrama de clases UML, la clase Client no accede directamente a las clases del subsistema. En cambio, Client funciona a través de una clase Facade que implementa una interfaz simple en términos de (delegando en) las clases del subsistema (Class1, Clase2 y Clase3). El Cliente depende únicamente de la sencilla interfaz Facade y es independiente del subsistema complejo.

El diagrama de secuencia muestra las interacciones en tiempo de ejecución: El objeto Client funciona a través de un objeto Facade que delega la solicitud a Class1, Class2 y Class3 instancias que realizan la solicitud.

Diagrama de clases UML

Example of Facade design pattern in UML.png

Facade
La clase de fachada abstracts Paquetes 1, 2, y 3 del resto de la aplicación.
Clientes
Los objetos están utilizando el Patrón Facade para acceder a los recursos de los Paquetes.

Ejemplo

Este es un ejemplo abstracto de cómo un cliente ("usted") interactúa con una fachada (la "computadora") de un sistema complejo (partes internas de la computadora, como CPU y disco duro).

C++

struct CPU {} vacío Quieto(); vacío Salto()largo posición); vacío Ejecutar();};struct HardDrive {} char* Leer()largo lba, int tamaño);};struct Memoria {} vacío Carga()largo posición, char* datos);};clase ComputerFacade {} público: vacío Comienzo() {} cpu_.Quieto(); memoria_.Carga()kBootAddress, hard_drive_.Leer()kBootSector, kSectorSize)); cpu_.Salto()kBootAddress); cpu_.Ejecutar(); } privado: CPU cpu_; Memoria memoria_; HardDrive hard_drive_;};int principal() {} ComputerFacade ordenador; ordenador.Comienzo();}