design patterns - pattern - ¿Qué es el patrón de diseño de fachada?
patrones de diseño java (19)
Una fachada es una clase con un nivel de funcionalidad que se encuentra entre un conjunto de herramientas y una aplicación completa, que ofrece un uso simplificado de las clases en un paquete o subsistema. La intención del patrón Facade es proporcionar una interfaz que haga que un subsistema sea fácil de usar. - Extracto del book Patrones de diseño en C #.
¿ Fachada es una clase que contiene muchas otras clases?
¿Qué lo hace un patrón de diseño? Para mí, es como una clase normal.
¿Puedes explicarme este patrón de Fachada ?
Básicamente es un sistema de eliminación de ventanas único. Usted asigna cualquier trabajo que delegará a un método particular en otra clase.
Como se explicó en la respuesta anterior, proporciona una interfaz simple para el cliente consumidor. Por ejemplo: "ver ESPN" es la función prevista. Pero implica varios pasos como:
- Encienda la TV si es necesario;
- Verifique el funcionamiento del cable / satélite;
- Cambie a ESPN si es necesario.
Pero la fachada simplificará esto y solo proporcionará la función "ver ESPN" al cliente.
El patrón de fachada es un envoltorio de muchas otras interfaces en un resultado para producir una interfaz más simple.
Los patrones de diseño son útiles ya que resuelven problemas recurrentes y en general simplifican el código. En un equipo de desarrolladores que aceptan usar los mismos patrones, mejora la eficiencia y la comprensión al mantener el código de los demás.
Intenta leer sobre más patrones:
Patrón de fachada: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1
o más generalmente: http://www.dofactory.com/Patterns/Patterns.aspx
El patrón de fachada proporciona una interfaz unificada para el grupo de interfaz del subsistema. La fachada define una interfaz de alto nivel, que simplifica el trabajo con el subsistema.
En cuanto a tus consultas:
¿Fachada es una clase que contiene muchas otras clases?
Sí. Es un contenedor para muchos subsistemas en la aplicación.
¿Qué lo hace un patrón de diseño? Para mí, es como una clase normal
Todos los patrones de diseño también son clases normales. @ Unmesh Kondolikar contestó correctamente esta consulta.
Me puedes explicar acerca de esta Fachada, soy nuevo en el diseño de patrones.
Según GoF, el patrón de diseño de Fachada se define como:
Proporcionar una interfaz unificada para un conjunto de interfaces en un subsistema. Facade Pattern define una interfaz de nivel superior que hace que el subsistema sea más fácil de usar
El patrón de Facade se usa generalmente cuando:
- Se requiere una interfaz simple para acceder a un sistema complejo.
- Las abstracciones y las implementaciones de un subsistema están estrechamente relacionadas.
- Necesita un punto de entrada para cada nivel de software en capas.
- El sistema es muy complejo o difícil de entender.
Tomemos un ejemplo de palabra real del sitio web cleartrip .
Este sitio web ofrece opciones para reservar
- Vuelos
- Hoteles
- Vuelos + Hoteles
Fragmento de código:
import java.util.*;
public class TravelFacade{
FlightBooking flightBooking;
TrainBooking trainBooking;
HotelBooking hotelBooking;
enum BookingType {
Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
};
public TravelFacade(){
flightBooking = new FlightBooking();
trainBooking = new TrainBooking();
hotelBooking = new HotelBooking();
}
public void book(BookingType type, BookingInfo info){
switch(type){
case Flight:
// book flight;
flightBooking.bookFlight(info);
return;
case Hotel:
// book hotel;
hotelBooking.bookHotel(info);
return;
case Train:
// book Train;
trainBooking.bookTrain(info);
return;
case Flight_And_Hotel:
// book Flight and Hotel
flightBooking.bookFlight(info);
hotelBooking.bookHotel(info);
return;
case Train_And_Hotel:
// book Train and Hotel
trainBooking.bookTrain(info);
hotelBooking.bookHotel(info);
return;
}
}
}
class BookingInfo{
String source;
String destination;
Date fromDate;
Date toDate;
List<PersonInfo> list;
}
class PersonInfo{
String name;
int age;
Address address;
}
class Address{
}
class FlightBooking{
public FlightBooking(){
}
public void bookFlight(BookingInfo info){
}
}
class HotelBooking{
public HotelBooking(){
}
public void bookHotel(BookingInfo info){
}
}
class TrainBooking{
public TrainBooking(){
}
public void bookTrain(BookingInfo info){
}
}
Explicación:
FlightBooking, TrainBooking and HotelBooking
son diferentes subsistemas del gran sistema:TravelFacade
TravelFacade
ofrece una interfaz simple para reservar una de las siguientes opcionesFlight Booking Train Booking Hotel Booking Flight + Hotel booking Train + Hotel booking
la API del libro de TravelFacade internamente llama debajo de las API de los subsistemas
flightBooking.bookFlight trainBooking.bookTrain(info); hotelBooking.bookHotel(info);
De esta forma,
TravelFacade
proporciona una API más simple y fácil sin exponer las API del subsistema.
journaldev clave: (del artículo de journaldev de Pankaj Kumar )
- El patrón de fachada es más como un ayudante para aplicaciones de cliente
- El patrón de fachada se puede aplicar en cualquier punto del desarrollo, generalmente cuando el número de interfaces crece y el sistema se complementa x.
- Las interfaces de subsistema no conocen Facade y no deberían tener ninguna referencia de la interfaz Facade.
- El patrón de fachada debe aplicarse para un tipo similar de interfaces , su propósito es proporcionar una única interfaz en lugar de múltiples interfaces que realizan el mismo tipo de trabajos
Eche un vistazo al artículo de sourcemaking de sourcemaking también para una mejor comprensión.
Facade discute la encapsulación de un subsistema complejo dentro de un único objeto de interfaz. Esto reduce la curva de aprendizaje necesaria para aprovechar con éxito el subsistema. También promueve la disociación del subsistema de sus potenciales clientes. Por otro lado, si Fachada es el único punto de acceso para el subsistema, limitará las características y la flexibilidad que puedan necesitar los "usuarios avanzados".
Facade oculta las complejidades del sistema y proporciona una interfaz para el cliente desde donde el cliente puede acceder al sistema.
public class Inventory {
public String checkInventory(String OrderId) {
return "Inventory checked";
}
}
public class Payment {
public String deductPayment(String orderID) {
return "Payment deducted successfully";
}
}
public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();
public void placeOrder(String orderId) {
String step1 = inventry.checkInventory(orderId);
String step2 = pymt.deductPayment(orderId);
System.out
.println("Following steps completed:" + step1
+ " & " + step2);
}
}
public class Client {
public static void main(String args[]){
OrderFacade orderFacade = new OrderFacade();
orderFacade.placeOrder("OR123456");
System.out.println("Order processing completed");
}
}
Fachada Diseño Patrón viene bajo Patrón de diseño estructural. En resumen, Fachada significa la apariencia exterior. Significa que en el patrón de diseño de Fachada ocultamos algo y mostramos solo lo que realmente requiere el cliente. Lea más en el siguiente blog: http://www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html
Otro ejemplo de fachada: supongamos que su aplicación se conecta a la base de datos y muestra los resultados en la interfaz de usuario. Puede usar fachada para hacer que su aplicación sea configurable, como en ejecutar usando una base de datos o con objetos simulados. Por lo tanto, realizará todas las llamadas de la base de datos a la clase fachada, donde leerá la configuración de la aplicación y decidirá disparar la consulta db o devolver el objeto simulado. de esta manera, la aplicación pasa a ser independiente de db en caso de que db no esté disponible.
Probablemente la mejor explicación del patrón Facade (y muchos otros) http://www.jakowicz.com/facade-pattern-in-php/
Todos los patrones de diseño son algunas clases organizadas de una manera u otra que se adapta a una aplicación específica. El propósito del patrón de fachada es ocultar la complejidad de una operación u operaciones. Puede ver un ejemplo y aprender el patrón de fachada en http://preciselyconcise.com/design_patterns/facade.php
Un patrón de diseño es una forma común de resolver un problema recurrente. Las clases en todos los patrones de diseño son solo clases normales. Lo importante es cómo están estructurados y cómo trabajan juntos para resolver un problema determinado de la mejor manera posible.
El patrón de diseño de fachada simplifica la interfaz a un sistema complejo; porque generalmente se compone de todas las clases que componen los subsistemas del sistema complejo.
Una fachada protege al usuario de los detalles complejos del sistema y les proporciona una simplified view
que es easy to use
. También decouples
el código que usa el sistema de los detalles de los subsistemas, lo que facilita la modificación posterior del sistema.
http://www.dofactory.com/Patterns/PatternFacade.aspx
http://www.blackwasp.co.uk/Facade.aspx
Además, lo que es importante al aprender patrones de diseño es poder reconocer qué patrón se ajusta a su problema y luego usarlo de manera apropiada. Es algo muy común utilizar mal un patrón o tratar de encajarlo en algún problema simplemente porque lo sabe. Tenga en cuenta estas dificultades mientras aprende / utilizando patrones de diseño.
Un patrón de diseño es una solución general reutilizable para un problema común en un contexto dado en el diseño de software.
El patrón de diseño de fachada es un patrón estructural, ya que define una manera de crear relaciones entre clases o entidades. El patrón de diseño de fachada se usa para definir una interfaz simplificada para un subsistema más complejo.
El patrón de fachada es ideal cuando se trabaja con un gran número de clases interdependientes o con clases que requieren el uso de múltiples métodos, particularmente cuando son complicados de usar o difíciles de entender. La clase de fachada es una "envoltura" que contiene un conjunto de miembros que son fáciles de entender y fáciles de usar. Estos miembros acceden al subsistema en nombre del usuario de la fachada, ocultando los detalles de la implementación.
El patrón de diseño de fachada es particularmente útil cuando se envuelven subsistemas que están mal diseñados pero no se pueden refactorizar porque el código fuente no está disponible o la interfaz existente es ampliamente utilizada. A veces puede decidir implementar más de una fachada para proporcionar subconjuntos de funciones para diferentes propósitos.
Un ejemplo de uso del patrón de fachada es la integración de un sitio web con una aplicación comercial. El software existente puede incluir grandes cantidades de lógica empresarial a las que se debe acceder de una manera particular. El sitio web puede requerir solo acceso limitado a esta lógica comercial. Por ejemplo, el sitio web puede necesitar mostrar si un artículo en venta ha alcanzado un nivel de stock limitado. El método IsLowStock de la clase fachada podría devolver un valor booleano para indicar esto. Detrás de escena, este método podría estar ocultando las complejidades de procesar el stock físico actual, el stock entrante, los artículos asignados y el bajo nivel de stock para cada artículo.
Un uso adicional del patrón Façade podría ser reducir la curva de aprendizaje de su equipo. Dejame darte un ejemplo:
Supongamos que su aplicación necesita interactuar con MS Excel haciendo uso del modelo de objetos COM proporcionado por Excel. Uno de los miembros de su equipo conoce todas las API de Excel y crea una Fachada en la parte superior, que cumple con todos los escenarios básicos de la aplicación. Ningún otro miembro del equipo necesita dedicar tiempo a aprender la API de Excel. El equipo puede usar la fachada sin conocer las partes internas o todos los objetos de MS Excel involucrados en el cumplimiento de un escenario. ¿No es genial?
Por lo tanto, proporciona una interfaz simplificada y unificada en la parte superior de un subsistema complejo.
Una explicación breve y simple:
- El patrón de fachada proporciona una interfaz unificada para un conjunto de interfaz (s) en un subsistema.
- Facade define una interfaz de nivel superior que hace que el subsistema sea más fácil de usar.
Intenta comprender el escenario con y sin Fachada:
Si desea transferir el dinero de la cuenta1 a la cuenta2, entonces los dos subsistemas a invocar son, retirar de la cuenta1 y depositar en la cuenta2.
Una fachada expone las funciones simplificadas que se llaman en su mayoría y la implementación oculta la complejidad que los clientes tendrían que enfrentar. En general, la implementación usa múltiples paquetes, clases y funciones allí. Las fachadas bien escritas hacen que el acceso directo a otras clases sea raro. Por ejemplo, cuando visito un cajero automático y retiro una cantidad. El cajero automático oculta si va directamente al banco propiedad o está yendo a través de una red negociada para un banco externo. El cajero automático funciona como una fachada que consume múltiples dispositivos y subsistemas que como cliente no tengo que tratar directamente.
Una fachada no debe describirse como una clase que contiene muchas otras clases. De hecho, es una interfaz para estas clases y debería facilitar el uso de las clases, de lo contrario la clase de fachada es inútil.
Wikipedia tiene un gran ejemplo de patrón de fachada.
/* Complex parts */
class CPU {
public void freeze() { ... }
public void jump(long position) { ... }
public void execute() { ... }
}
class Memory {
public void load(long position, byte[] data) { ... }
}
class HardDrive {
public byte[] read(long lba, int size) { ... }
}
/* Facade */
class ComputerFacade {
private CPU processor;
private Memory ram;
private HardDrive hd;
public ComputerFacade() {
this.processor = new CPU();
this.ram = new Memory();
this.hd = new HardDrive();
}
public void start() {
processor.freeze();
ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
processor.jump(BOOT_ADDRESS);
processor.execute();
}
}
/* Client */
class You {
public static void main(String[] args) {
ComputerFacade computer = new ComputerFacade();
computer.start();
}
}