2008-10-30 14 views
15

Sprawdziłem z wikipedia article i wygląda na to, że brakuje wersji C++ przykładu kodu. Nie jestem w stanie w pełni docenić wzorca Fasady bez tego, czy mógłbyś pomóc mi to wyjaśnić za pomocą C++?Wyjaśnij wzór fasadowy z przykładem C++?

+0

Czy mógłbyś podać link do artykułu? –

+0

http://pl.wikipedia.org/wiki/Facade_pattern – yesraaj

+0

Edytowanie pytania byłoby bardziej pomocne dla innych. – tonylo

Odpowiedz

21

Wzór fasady: zapewnia ujednolicony - uproszczony interfejs do złożonego podsystemu lub zestawu interfejsów. Zapewnia wyższy poziom interfejsu jednocześnie oddzielając klienta od złożonego podsystemu.

Przykład, który pomoże Ci zrozumieć ... kierowcę kabiny. Poinformuj kierowcę kabiny "Zabierz mnie do PointX" (ujednolicony, uproszczony interfejs wysokiego poziomu), który następnie rozpoczyna sekwencję czynności (obraca klucz, zmienia bieg, naciska pedał przyspieszenia itd.), Aby wykonać zadanie. Usuwa złożoność podsystemów (skrzyni biegów, silnika itp.), Dzięki czemu nie musisz się o nie martwić. Kierowca oddziela cię również od używanego pojazdu ... nie łączysz się bezpośrednio z samochodem. Możesz potencjalnie dać mu Mercera, ale twoim interfejsem do Driver będzie nadal TakeMeTo (X) .. nie jesteś przywiązany do żadnego konkretnego modelu/marki samochodu.

W rzeczywistym świecie można znaleźć fasady, w których można łączyć się z komponentami lub bibliotekami stron trzecich. Nie chcesz, aby twój kod był zależny od konkretnego dostawcy, więc wprowadzasz interfejs fasadowy do rozłączania. Uprościsz także ten interfejs, np. twój interfejs fasady miałby metodę SendData (string), ale wewnętrznie implementacja może wywoływać n metod na m-pakietach w określonej kolejności, aby wykonać zadanie. Tak pokazuje diagram na stronie wikipedii.

np. Tłumaczenia an example do C++ i utrzymanie jej maleńką

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

Tutaj fikcyjną Biblioteka dla WWW w C++ jest fasada, która jednoczy aspekty protokołu, sieci i analizowania problemu tak, że mogę skupić się na moim pierwotnym ognisku pobierania zasobu . Metoda get ukrywa/enkapsuluje/utrzymuje w jednym miejscu złożoność (i w niektórych przypadkach brzydotę) HTTP, FTP i innych różnych protokołów, żądanie-odpowiedź, zarządzanie połączeniami itp. Również, jeśli jutro twórcy LWCPPSimple znajdą sposób, aby get() był dwa razy szybszy, dostaję korzyści wydajności za darmo. Mój kod klienta nie musi się zmieniać.

+0

Wow. Podoba mi się to wyjaśnienie. To znaczy, wiedziałem, co to jest Fasada, ale to jest po prostu świetne. –

+0

Cieszę się, że Ci się spodobało :) – Gishu

+0

Świetne wyjaśnienie, może dobrze pójść z tym przykładem kodu kodu. http://stackoverflow.com/questions/249581/explain-facade-pattern-with-c-przykład#249995 –

3

Wykonałem wyszukiwanie i zamianę na przykładzie C#. To nie może pomóc, bo jeśli zrozumieć C++, to powinieneś być w stanie zrozumieć, C#, ponieważ wykorzystuje te same konstrukcje i słowa kluczowe (klas, funkcji, nazw, publiczne, itp)

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

W pewnym sensie, Fasada jest po prostu API dla klientów, którzy chcą wchodzić w interakcje z czymś ukrytym.

Elewacja przydaje się podczas prezentowania prostego API C dla czegoś, co jest zaimplementowane w C++ lub po prostu bardziej skomplikowane niż API. Lub, aby uzyskać stałą barierę między klientem a biblioteką, gdy biblioteka musi przejść przez wiele aktualizacji iteracyjnych i chcesz wpłynąć na klienta w jak najmniejszym stopniu. Na przykład, jeśli biblioteka oparta na C musi być wewnętrznie zaktualizowana do C++ lub czegoś innego, lub po prostu zamieniona na coś zupełnie innego, wówczas Fasada jest dobrą warstwą środkową dla klienta.

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

Klasa A Nie bezpośrednio używać metod albo bezpośrednio wpływać na stan klasy C lub dowolnego innego podsystemu klasa B zawiera. Wyświetlany jest tu tylko jeden podsystem, ponieważ nie ma znaczenia, ile istnieje podsystemów.