Domanda

Ho verificato con l'articolo di Wikipedia e sembra che manchi la versione c ++ di un esempio di codice. Non sono in grado di apprezzare appieno il modello di facciata senza questo, puoi aiutarmi a spiegarmelo usando C ++?

È stato utile?

Soluzione

Modello di facciata: fornisce un'interfaccia unificata e semplificata a un sottosistema complesso o a una serie di interfacce. Fornisce un'interfaccia di livello superiore che disaccoppia contemporaneamente il client dal sottosistema complesso.

Un esempio per aiutarti a capire .. un tassista. Dite al tassista "Portami a PointX" (interfaccia unificata di alto livello semplificata) che inizia quindi una sequenza di azioni (gira la chiave, cambia marcia, preme l'acceleratore, ecc ...) per eseguire l'operazione. Sottrae la complessità dei sottosistemi sottostanti (cambio, motore, ecc.) In modo da non doversi preoccupare di loro. Inoltre, il conducente ti disaccoppia dal veicolo effettivamente utilizzato ... non ti interfaccia direttamente con la macchina. Potresti potenzialmente dargli un Merc ma la tua interfaccia per il Driver sarebbe comunque TakeMeTo (X) .. non sei legato a nessun modello / marca specifico dell'auto.

In un esempio del mondo reale, troverai facciate in cui ti interfaccia con componenti o librerie di terze parti. Non si desidera che il codice dipenda da un fornitore specifico, quindi si introduce un'interfaccia di facciata per il disaccoppiamento. Inoltre semplificherai questa interfaccia, ad es. l'interfaccia della tua facciata avrebbe un metodo chiamato SendData (stringa) ma internamente l'implementazione può chiamare n metodi su m sotto-pacchetti in un ordine specifico per portare a termine l'attività. Questo è ciò che mostra il diagramma sulla pagina di Wikipedia.

es. Traducendo un esempio in C ++ e mantenendolo minuscolo

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

Qui la fittizia Library For WWW in C ++ è una facciata che unisce gli aspetti del protocollo, della rete e dell'analisi del problema in modo che io possa concentrarmi sul mio obiettivo principale di recuperare la risorsa. Il metodo get nasconde / incapsula / mantiene in un solo posto la complessità (e in alcuni casi la bruttezza) di HTTP, FTP e altri protocolli vari, richiesta-risposta, gestione della connessione, ecc. Anche se domani i creatori di LWCPPSimple trovano un Il modo per rendere get () due volte più veloce, ottengo i vantaggi in termini di prestazioni gratuitamente. Il mio codice cliente non deve cambiare.

Altri suggerimenti

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

Ho fatto una ricerca e sostituisco nell'esempio C #. Questo potrebbe non aiutarti, perché se capisci il C ++ allora dovresti essere in grado di capire il C # poiché usa gli stessi costrutti e parole chiave (classi, funzioni, spazi dei nomi, pubblico, ecc.)

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

In un certo senso, una facciata è solo un'API per i clienti che vogliono interagire con qualcosa di nascosto.

La facciata è utile quando si espone una semplice API C per qualcosa che è implementato in C ++ o semplicemente più complesso dell'API. O per ottenere una barriera fissa tra un client e una libreria quando la libreria deve passare attraverso numerosi aggiornamenti iterativi e si desidera influenzare il client il meno possibile. Ad esempio, se una libreria basata su C deve essere aggiornata internamente a C ++ o qualcos'altro, o semplicemente scambiata con qualcosa di completamente diverso, allora la facciata è un buon livello intermedio per il client.

Ci sono Esempi C ++ per Facciata in questo eccellente sito sui motivi di design.

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 classe A non utilizzerà direttamente alcun metodo né influenzerà direttamente lo stato della classe C o qualsiasi altro sottosistema che contiene la classe B. Qui viene mostrato un solo sottosistema perché non importa quanti sottosistemi ci siano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top