Pregunta

He comprobado con el artículo de wikipedia , y parece que falta la versión c ++ de un ejemplo de código. No puedo apreciar completamente el patrón de Fachada sin esto, ¿podría ayudarme a explicarme usando C ++?

¿Fue útil?

Solución

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

Un ejemplo para ayudarte a entender ... un conductor de taxi. Le dice al conductor del taxi 'Llévame a PointX' (interfaz unificada de alto nivel simplificada) que luego comienza una secuencia de acciones (gira la llave, cambia de marcha, presiona el acelerador, etc.) para realizar la tarea. Extrae la complejidad de los subsistemas subyacentes (caja de cambios, motor, etc.) para que no tenga que preocuparse por ellos. El conductor también lo desacopla del vehículo real utilizado ... usted no interactúa directamente con el automóvil. Podrías darle un Merc, pero tu interfaz con el controlador aún sería TakeMeTo (X). No estás atado a ningún modelo / marca específica del auto.

En un ejemplo del mundo real, encontrará fachadas en las que interactúa con componentes o bibliotecas de terceros. No desea que su código dependa de un proveedor específico, por lo que introduce una interfaz de fachada para desacoplar. También simplificarás esta interfaz, por ejemplo. Su interfaz de fachada tendría un método llamado SendData (cadena), pero internamente la implementación puede llamar a 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.

por ejemplo Traduciendo un ejemplo a C ++ y manteniéndolo pequeño

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

Aquí, la biblioteca ficticia para WWW en C ++ es una fachada que unifica los aspectos del protocolo, la red y el análisis, de modo que pueda concentrarme en mi enfoque principal de buscar el recurso. El método get oculta / encapsula / mantiene en un solo lugar la complejidad (y en algunos casos la 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 Para 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.

Otros consejos

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;
}

He hecho una búsqueda y reemplazo en el ejemplo de C #. Es posible que esto no le ayude, porque si entiende C ++, debería poder entender el C # ya que usa las mismas construcciones y palabras clave (clases, funciones, espacios de nombres, público, 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;
}

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 de C simple para algo que está 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 algo más, o simplemente cambiarse por algo completamente diferente, entonces la Fachada es una buena capa intermedia para el cliente.

Hay ejemplos de C ++ para Facade en este excelente sitio sobre patrones de diseño.

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; }
};

La clase A no utilizará directamente ningún método ni afectará directamente el estado de la clase C o cualquier otro subsistema que contenga la clase B. Aquí solo se muestra un subsistema porque no importa cuántos subsistemas hay.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top