Patrones de diseño – Una guía rápida del patrón Facade.

Paso 1 – Palabras clave

Definir palabras clave es la receta secreta en esta serie de guías rápidas. Este método me ayudó a entender realmente los patrones de diseño, a codificarlos en mi mente y a comprender las diferencias entre otros patrones de diseño.

  1. Simplificación: Este es el objetivo de este patrón de diseño. Simplificar un sistema complicado.
  2. Restricción: La simplificación suele tener un «coste sagrado», la restricción. Al simplificar el código, restringimos a los clientes el acceso no autorizado. Por tanto, se evita que cometan errores que difícilmente se percibirían en un subsistema complicado.

Hay un compromiso entre simplificación y restricción. Sobre-simplificar un sistema significa que el desarrollador está sobre-restringido, por lo tanto menos libertad de la necesaria lo cual no siempre es algo bueno. Simplificar demasiado el patrón Facade significa que hay demasiada libertad, lo que hace que el patrón Facade sea irrelevante. Encontrar el fino equilibrio es lo que hace que un patrón Facade sea bueno, útil y efectivo.

Paso 2 – Diagrama

El diagrama también se basa en el ejemplo dado. Para simplificar este diagrama podemos separar en tres piezas.

  1. Cliente: El cliente en este ejemplo es el cliente de un restaurante que quiere pedir comida.
  2. Fachada: Su trabajo es poder proporcionar al cliente un acceso más simplificado hacia numerosos subsistemas interdependientes que se consideran complicados. En este ejemplo, el pedido de comida de un cliente requeriría una serie de llamadas a métodos cuidadosamente secuenciados de dos subsistemas diferentes (Camarero y Cocina).
  3. Subsistemas: Los subsistemas están ocultos para el cliente. También pueden no ser accesibles para el cliente. El cliente no puede manipular ninguno de los subsistemas donde un simple cambio de código puede resultar fatal o incluso romper otras partes desconocidas del propio sistema. En este escenario, el camarero y la cocina tienen que realizar una serie de tareas. A veces, la tarea de un subsistema depende de la de otro. Por ejemplo, la cocina no puede preparar la comida si el camarero no lleva el pedido a la cocina. El camarero no puede servir al cliente si la comida no está cocinada.

Paso 3 – Código por ejemplo

Le sugiero que copie el código clase por clase de mi repositorio git «Andreas Poyias» o los fragmentos de abajo (en el orden proporcionado) y lo pegue en cualquiera de los editores de C++ disponibles en línea como c++shell, jdoodle , onlineGDB y lo ejecute para observar la salida. A continuación, lee los comentarios o la descripción de abajo. Tómate tu tiempo, leyéndolo detenidamente (eso significa un minuto, ni menos ni más).

Subsistemas

En este ejemplo, los dos subsistemas son el Waiter_Subsystem1y elKitchen_Subsystem2. A primera vista, cada subsistema parece ser independiente, ya que pueden hacer ciertas tareas individualmente. Pero, ¿es esto cierto?

#include <iostream>
using namespace std;class Waiter_Subsystem1
{
public:
void writeOrder() { cout << " Waiter writes client's order\n";}
void sendToKitchen(){ cout << " Send order to kitchen\n";}
void serveCustomer(){ cout << " Yeeei customer is served!!!\n";}
};class Kitchen_Subsystem2
{
public:
void prepareFood(){ cout << " Cook food\n";}
void callWaiter() { cout << " Call Waiter\n";}
void washDishes() { cout << " Wash the dishes\n";}
};

Fachada: En este ejemplo, la clase Facade se ocupa de los pedidos de comida en el restaurante. Para ejecutar un pedido de comida con éxito, dependemos de una secuencia específica de llamadas a métodos y una llamada depende de la anterior y así sucesivamente. La cocina, no puede preparar la comida si el camarero no escribe el pedido y lo envía a la cocina. La clase Facade proporciona laorderFood tarea al cliente para simplificarla y evitar cualquier mal uso debido a la complejidad que existe.

class Order_Facade
{
private:
Waiter_Subsystem1waiter;
Kitchen_Subsystem2 kitchen;
public:
void orderFood()
{
cout << "A series of interdependent calls on various subsystems:\n";
waiter.writeOrder();
waiter.sendToKitchen();
kitchen.prepareFood();
kitchen.callWaiter();
waiter.serveCustomer();
kitchen.washDishes();
}
};

Función principal
La función principal opera como el cliente(igual que las guías anteriores). Es tan fácil para el cliente poder crear una instancia de Facade y llamar a una función para hacer su trabajo.

int main(int argc, char *argv)
{
// Simple for the client
// no need to know the order or the
// dependencies among various subsystems.
Order_Facade facade;
facade.orderFood();return 0;
}// Output
// A series of interdependent calls on various subsystems:
// Waiter writes client's order
// Send order to kitchen
// Cook food
// Call Waiter
// Yeeei customer is served!!!
// Wash the dishes

Hay unos cuantos beneficios para el uso del patrón Facade y unos cuantos puntos a tener en cuenta cuando se va a abordar Facade.

  • Facade define una interfaz de nivel superior que hace que el subsistema sea más fácil de usar al envolver un subsistema complicado.
  • Esto reduce la curva de aprendizaje necesaria para aprovechar con éxito el subsistema.
  • También promueve el desacoplamiento del subsistema de sus potencialmente muchos clientes.
  • Por otro lado, si la Fachada es el único punto de acceso para el subsistema, limitará las características y la flexibilidad que los «usuarios avanzados» pueden necesitar.

El siguiente blog será una guía rápida del patrón de diseño Observer. Es un patrón de comportamiento que no puede faltar en tu repositorio de conocimientos. No olvides darle like/clap a mi blog-post y seguir mi cuenta. Esto es para darme la satisfacción de haber ayudado a algunos compañeros desarrolladores y empujarme a seguir escribiendo. Si hay un patrón de diseño específico que te gustaría aprender entonces házmelo saber para que pueda proporcionártelo en el futuro.

Otras guías rápidas sobre patrones de diseño:

  1. Patrones de diseño – Una guía rápida de Abstract Factory.
  2. Patrones de diseño – Una guía rápida de Bridge Pattern.
  3. Patrones de diseño – Una guía rápida del patrón constructor.
  4. Patrones de diseño – Una guía rápida del patrón decorador.
  5. Patrones de diseño – Una guía rápida del patrón fachada.
  6. Patrones de diseño – Una guía rápida del patrón observador.
  7. Patrones de diseño – Una guía rápida del patrón singleton.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.