Frage

Ich habe mit dem überprüft Wikipedia -Artikel, und es scheint, als würde die C ++ - Version eines Codebeispiels fehlen. Ich kann das Fassadenmuster ohne dieses nicht voll und ganz schätzen. Können Sie es mir bitte mit C ++ erklären?

War es hilfreich?

Lösung

Fassadenmuster: Bietet eine einheitliche Schnittstelle zu einem komplexen Subsystem oder einer Reihe von Schnittstellen. Es bietet eine Schnittstelle auf höherer Ebene, die gleichzeitig den Client aus dem komplexen Subsystem entkoppelt.

Ein Beispiel, um Ihnen zu helfen, einen Taxifahrer zu verstehen. Sie sagen dem CAB-Treiber "Take Me to pointX" (Unified Simplified High-Level-Schnittstelle), die dann mit einer Folge von Aktionen beginnt (dreht die Taste, ändert die Zahnräder, drückt den Gaspedal usw.), um die Aufgabe auszuführen. Er verringert die Komplexität der zugrunde liegenden Subsysteme (Getriebe, Motor usw.), damit Sie sich keine Sorgen um sie machen müssen. Der Fahrer entkoppelt Sie auch vom tatsächlichen Fahrzeug ... Sie haben nicht direkt mit dem Auto eine Verbindung hergestellt. Sie könnten ihm möglicherweise einen Merc geben, aber Ihre Schnittstelle zum Fahrer wäre immer noch Takemeto (x).

In einem Beispiel in der realen Welt finden Sie Fassaden, bei denen Sie mit Komponenten oder Bibliotheken von Drittanbietern verkaufen. Sie möchten nicht, dass Ihr Code von einem bestimmten Anbieter abhängt. Daher stellen Sie eine Fassadenschnittstelle in Decouple ein. Außerdem vereinfachen Sie diese Schnittstelle, z. B. Ihre Fassadenschnittstelle verfügt über eine Methode namens SendData (String), aber intern kann die Implementierung N-Methoden auf M-Unterpackungen in einer bestimmten Reihenfolge aufrufen, um die Aufgabe zu erledigen. Dies zeigt das Diagramm auf der Wikipedia -Seite.

zB übersetzen ein Beispiel zu c ++ und winzig zu halten

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

Hier ist die fiktive Bibliothek für WWW in C ++ eine Fassade, die Protokoll-, Netzwerk- und Parsingaspekte des Problems vereint, damit ich mich auf meinen Hauptaugenmerk darauf konzentrieren kann, die Ressource abzurufen. Die GET-Methode versteckt/verkaps/hält die Komplexität (und in einigen Fällen Hässlichkeit) von HTTP, FTP und anderen unterschiedlichen Protokollen, Anforderungsantwort, Verbindungsmanagement usw. Auch wenn morgen die Schöpfer von LWCPPSimple einen Fund eine Fund einen Anfrage, einen festigen Weg, um Get () zu machen, um doppelt so schnell zu sein, erhalte ich die Leistungsvorteile kostenlos. Mein Client -Code muss sich nicht ändern.

Andere Tipps

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

Ich habe eine Suche durchgeführt und im C# -Beispiel ersetzt. Dies hilft Ihnen möglicherweise nicht, denn wenn Sie C ++ verstehen, sollten Sie das C# verstehen können, da es dieselben Konstrukte und Schlüsselwörter verwendet (Klassen, Funktionen, Namespaces, öffentlich usw.)

// "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 gewisser Hinsicht ist eine Fassade nur eine API für Kunden, die mit etwas verstecktem interagieren möchte.

Die Fassade ist nützlich, wenn Sie eine einfache C -API für etwas freilegen, das in C ++ oder einfach komplexer als die API implementiert ist. Oder um eine feste Barriere zwischen einem Kunden und einer Bibliothek zu erhalten, wenn die Bibliothek zahlreiche iterative Updates durchlaufen muss und Sie den Kunden so wenig wie möglich beeinflussen möchten. Wenn beispielsweise eine C-basierte Bibliothek intern auf C ++ oder etwas anderes oder nur gegen etwas völlig anderes ausgetauscht werden muss, ist die Fassade ein guter Mittelschicht für den Kunden.

Es gibt C ++ Beispiele zum Fassade An dieser ausgezeichneten Stelle über Designmuster.

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

Die Klasse A verwendet keine direkten Methoden oder wirkt sich direkt auf den Zustand der Klasse C oder eines anderen Subsystems, das die Klasse B enthält, beeinflusst. Hier wird nur ein Subsystem gezeigt, da es egal ist, wie viele Subsysteme es gibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top