El diagrama también se basa en el ejemplo dado. Para simplificar este diagrama podemos separar en tres piezas.
- Cliente: El cliente en este ejemplo es el cliente de un restaurante que quiere pedir comida.
- 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).
- 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_Subsystem1
y 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:
- Patrones de diseño – Una guía rápida de Abstract Factory.
- Patrones de diseño – Una guía rápida de Bridge Pattern.
- Patrones de diseño – Una guía rápida del patrón constructor.
- Patrones de diseño – Una guía rápida del patrón decorador.
- Patrones de diseño – Una guía rápida del patrón fachada.
- Patrones de diseño – Una guía rápida del patrón observador.
- Patrones de diseño – Una guía rápida del patrón singleton.