Question

J'ai vérifié avec le article wikipedia , et il semble qu'il manque la version c ++. d'un exemple de code. Je ne suis pas en mesure d’apprécier pleinement le motif Façade sans cela. Pouvez-vous m'aider à me l'expliquer en utilisant C ++?

Était-ce utile?

La solution

Modèle de façade: fournit une interface simplifiée unifiée à un sous-système complexe ou à un ensemble d'interfaces. Il fournit une interface de niveau supérieur qui dissocie simultanément le client du sous-système complexe.

Un exemple pour vous aider à comprendre .. un chauffeur de taxi. Vous dites au chauffeur de taxi «Emmenez-moi à PointX» (interface de haut niveau simplifiée unifiée) qui commence ensuite une séquence d'actions (tourne la clé, change de vitesse, appuie sur l'accélérateur, etc.) pour effectuer la tâche. Il élimine la complexité des sous-systèmes sous-jacents (boîte de vitesses, moteur, etc.) afin que vous n'ayez pas à vous en soucier. Le conducteur vous dissocie également du véhicule réel utilisé… vous ne vous connectez pas directement à la voiture. Vous pourriez potentiellement lui donner un merc, mais votre interface avec le pilote serait toujours TakeMeTo (X). Vous n'êtes lié à aucun modèle / marque spécifique de la voiture.

Dans un exemple concret, vous trouverez des façades où vous vous connectez à des composants tiers ou à des bibliothèques. Vous ne voulez pas que votre code dépende d'un fournisseur spécifique, vous introduisez donc une interface de façade à découpler. Vous allez également simplifier cette interface, par exemple. votre interface de façade aurait une méthode appelée SendData (chaîne), mais en interne, l'implémentation peut appeler n méthodes sur m sous-packages dans un ordre spécifique pour que la tâche soit effectuée. C’est ce que montre le schéma de la page wikipedia.

par exemple. Traduire un exemple en C ++ et le garder minuscule

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

Ici, la bibliothèque fictive For WWW en C ++ est une façade qui unit le protocole, le réseau et l’analyse des aspects du problème afin que je puisse me concentrer sur mon objectif principal, qui consiste à extraire la ressource. La méthode get masque / encapsule / conserve en un seul endroit la complexité (et dans certains cas la laideur) de HTTP, FTP et d'autres protocoles variés, requête-réponse, gestion de connexion, etc. Pour que get () soit deux fois plus rapide, je profite gratuitement des performances. Mon code client ne doit pas changer.

Autres conseils

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

J'ai effectué une recherche et remplacé sur l'exemple C #. Cela ne vous aidera peut-être pas, car si vous comprenez le C ++, vous devriez pouvoir le comprendre car il utilise les mêmes constructions et les mêmes mots clés (classes, fonctions, espaces de noms, public, 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 sens, une façade est simplement une API pour les clients qui souhaitent interagir avec quelque chose de caché.

La façade est utile lors de l'exposition d'une API C simple pour quelque chose qui est implémenté en C ++ ou tout simplement plus complexe que l'API. Ou pour obtenir une barrière fixe entre un client et une bibliothèque lorsque celle-ci doit effectuer de nombreuses mises à jour itératives et que vous souhaitez affecter le client le moins possible. Par exemple, si une bibliothèque basée sur le C doit être mise à jour en interne vers C ++ ou autre, ou simplement remplacée par quelque chose de complètement différent, alors la façade est une bonne couche intermédiaire pour le client.

Il existe des exemples C ++ pour Façade sur cet excellent site sur les modèles de conception.

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 n'utilisera directement aucune méthode et n'affectera pas directement l'état de la classe C ou de tout autre sous-système que contient la classe B. Ici, un seul sous-système est affiché, car le nombre de sous-systèmes importe peu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top