2008-10-30 62 views

Respuesta

21

Patrón de fachada: proporciona una interfaz unificada y simplificada para un subsistema o conjunto de interfaces complejo. Proporciona una interfaz de nivel superior que desacopla simultáneamente al cliente del subsistema complejo.

Un ejemplo para ayudarlo a comprender ... un conductor de taxi. Le dice al conductor del taxi 'Llévame a PointX' (interfaz simplificada unificada de alto nivel) que luego comienza una secuencia de acciones (gira la tecla, cambia de marcha, presiona el acelerador, etc.) para realizar la tarea. Él abstrae la complejidad de los subsistemas subyacentes (caja de engranajes, motor, etc.) para que no tenga que preocuparse por ellos. El conductor también lo desacopla del vehículo real utilizado ... no tiene interfaz directa con el automóvil. Podrías darle un Merc pero tu interfaz con el Driver seguiría siendo TakeMeTo (X) ... no estás atada a ningún modelo/marca específico del automóvil.

En un ejemplo del mundo real, encontrará fachadas donde interactúa con bibliotecas o componentes de terceros. No desea que su código dependa de un proveedor específico, por lo que debe introducir una interfaz de fachada para desacoplarse. También simplificará esta interfaz, p. su interfaz de fachada tendría un método llamado SendData (cadena) pero internamente la implementación puede llamar n métodos en m subpaquetes en un orden específico para realizar la tarea. Esto es lo que muestra el diagrama en la página de wikipedia.

p. Ej. Traduciendo an example a C++ y mantenerla pequeña

sResource = LWCPPSimple::get("http://www.perl.org") 

Aquí la Biblioteca ficticia Para WWW en C++ es una fachada que unifica aspectos del protocolo, de red y de análisis del problema para que pueda concentrarse en mi objetivo principal de ir a buscar el recurso . El método get oculta/encapsula/mantiene en un lugar la complejidad (y en algunos casos fealdad) de HTTP, FTP y otros protocolos variados, solicitud-respuesta, gestión de conexión, etc. También si mañana los creadores de LWCPPSimple encuentran un forma de hacer que get() sea el doble de rápido, obtengo los beneficios de rendimiento de forma gratuita. Mi código de cliente no tiene que cambiar.

+0

Wow. Me gusta esta explicación Quiero decir, sabía lo que es una fachada, pero esto es simplemente genial. –

+0

contento de que le haya gustado :) – Gishu

+0

Gran Explicación, puede ir bien con este ejemplo de código de respuesta. http://stackoverflow.com/questions/249581/explain-facade-pattern-with-c-example#249995 –

3

Hice una búsqueda y reemplazo en el ejemplo C#. Esto no le podría ayudar, porque si usted entiende C++, entonces debería ser capaz de entender el C#, ya que utiliza las mismas construcciones y palabras clave (clases, funciones, espacios de nombres, públicos, etc)

// "Subsystem ClassA" 
#include <iostream> 
class SubSystemOne 
{ 
public: 
    void MethodOne() 
    { 
     std::cout << " SubSystemOne Method" << std::endl; 
    } 
} 

// Subsystem ClassB" 

class SubSystemTwo 
{ 
public: 
    void MethodTwo() 
    { 
     std::cout << " SubSystemTwo Method" << std::endl; 
    } 
} 

// Subsystem ClassC" 

class SubSystemThree 
{ 
public: 
    void MethodThree() 
    { 
      std::cout << " SubSystemThree Method" << std::endl; 
    } 
} 

// Subsystem ClassD" 

class SubSystemFour 
{ 
public: 
    void MethodFour() 
    { 
     std::cout << " SubSystemFour Method" << std::endl; 
    } 
} 

// "Facade" 

class Facade 
{ 
    SubSystemOne one; 
    SubSystemTwo two; 
    SubSystemThree three; 
    SubSystemFour four; 

public: 
    Facade() 
    { 
    } 

    void MethodA() 
    { 
     std::cout << "\nMethodA() ---- " << std::endl; 
     one.MethodOne(); 
     two.MethodTwo(); 
     four.MethodFour(); 
    } 
    void MethodB() 
    { 
     std::cout << "\nMethodB() ---- " << std::endl; 
     two.MethodTwo(); 
     three.MethodThree(); 
    } 
} 

int Main() 
{ 
    Facade facade = new Facade(); 

    facade.MethodA(); 
    facade.MethodB(); 

    return 0; 
} 
2

En un sentido, una Fachada es solo una API para clientes que desean interactuar con algo oculto.

La Fachada es útil cuando se expone una API simple de C para algo implementado en C++ o simplemente más complejo que la API. O para obtener una barrera fija entre un cliente y una biblioteca cuando la biblioteca necesita pasar por numerosas actualizaciones iterativas y desea afectar al cliente lo menos posible. Por ejemplo, si una biblioteca basada en C necesita actualizarse internamente a C++ o alguna otra cosa, o simplemente cambiarse por algo completamente diferente, entonces la Fachada es una buena capa intermedia para el cliente.

12
class Engine 
{ 

public: 
    void Start() { } 

}; 

class Headlights 
{ 

public: 
    void TurnOn() { } 

}; 

// That's your facade. 
class Car 
{ 

private: 
    Engine engine; 
    Headlights headlights; 

public: 
    void TurnIgnitionKeyOn() 
    { 
     headlights.TurnOn(); 
     engine.Start(); 
    } 

}; 

int Main(int argc, char *argv[]) 
{ 
    // Consuming facade. 
    Car car; 
    car.TurnIgnitionKeyOn(); 

    return 0; 
} 
0
class A { 
    private B b; // Class A uses Class B, the "interface" 
    public int f() { return b.g(); } 
}; 

class B { 
    private C c; // class B uses class C, a "subsystem" 
    private ... ...; // other subsystems can be added 
    public int g() { c.h(); return c.i(); } 
}; 

class C { // a subsystem 
    public void h() { ... } 
    public int i() { return x; } 
}; 

Clase A no utilizará directamente cualquiera de los métodos o afectar directamente el estado de clase C o cualquier otro subsistema que clase B contiene. Aquí solo se muestra un subsistema porque no importa cuántos subsistemas haya.

Cuestiones relacionadas