Jaki jest wzór fasady?


191

Czy fasada jest klasą, która zawiera wiele innych klas?

Co sprawia, że ​​jest to wzór projektowy? Dla mnie jest to jak normalna klasa.

Czy możesz mi wyjaśnić ten wzór elewacji ?


7
Każdy wzorzec projektowy ma w swojej realizacji kilka klas.
Felix Kling

1
Wzór fasady tworzy łatwy w użyciu interfejs, ukrywając wiele interfejsów w jednej klasie. Ten artykuł zawiera więcej szczegółów .
user3199690,

dobrze wyjaśnione w tym poście programmerzdojo.com/java-tutorials/…
rishi007bansod

Musiałem to zmienić, ponieważ „nie pokazuje wysiłku badawczego”
Roy Truelove

1
@RoyTruelove, rób co chcesz. Nie obchodzi mnie to, dopóki są odpowiedzi na pytanie. Jakaś pomocnicza odpowiedź na pytanie?
kevin

Odpowiedzi:


190

Wzorzec projektowy jest powszechnym sposobem rozwiązywania powtarzającego się problemu. Klasy we wszystkich wzorach projektowych są zwykłymi klasami. Ważne jest, jak są zbudowane i jak współpracują, aby rozwiązać dany problem w najlepszy możliwy sposób.

Wzór fasadowy upraszcza interfejs do złożonego systemu; ponieważ zazwyczaj składa się ze wszystkich klas, które tworzą podsystemy złożonego systemu.

Fasada chroni użytkownika przed złożonymi szczegółami systemu i zapewnia mu simplified viewto, co jest easy to use. Jest to również decoupleskod, który wykorzystuje system na podstawie szczegółów podsystemów, co ułatwia późniejszą modyfikację systemu.

http://www.dofactory.com/Patterns/PatternFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

Ważną rzeczą podczas uczenia się wzorców projektowych jest także umiejętność rozpoznania, który wzór pasuje do danego problemu, a następnie odpowiedniego jego wykorzystania. Bardzo powszechną rzeczą jest niewłaściwe użycie wzoru lub próba dopasowania go do jakiegoś problemu tylko dlatego, że go znasz. Pamiętaj o tych pułapkach, ucząc się \ używając wzorców projektowych.


9
@kevin: Wiedza o tym, kiedy ich użyć, jest najtrudniejsza. Teoretycznie wzory mogą być łatwe, ale imo są trudne w praktyce. Możesz się tego tylko nauczyć, tzn. kodowanie, kodowanie, kodowanie.
Felix Kling

Wzorzec projektu elewacji również jest wykorzystywany do ukrywania narzędzia klasy szczegółów i bezpiecznego dostarczania publicznego interfejsu API.
yebw

29
$ w jquery to tylko prosty przykład wzoru fasady, który zapewnia prosty interfejs i ukrywa całą złożoność
Ajay Beniwal

dla kogoś, kto szuka wzoru fasady z prawdziwym przykładem. natknąłem się na ten krótki tutuorial na youtube. mam nadzieję, że będzie przydatny youtu.be/dLjJo2v2re8
Sankar ganesh

czy możemy mieć więcej niż jedną warstwę elewacyjną dla pojedynczego systemu, gdy aplikacja rośnie?
Jeeva Jsb,

99

Wikipedia ma świetny przykład wzoru fasady.

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

6
To dobry przykład. Klient musi być w stanie poskładać wszystkie etapy fasady, jeśli tak też zrobi, nic nie powinno być ukryte metodami prywatnymi.
Rob

2
Imho to nie jest dobry przykład, ponieważ nie podkreśla przypadku użycia. Przykład pokazuje, jak powiedział TO, zwykłą klasę. Powiązanie ze sprzętem to kompozycja. Może przesada w przypadku przykładu na wiki, ale użycie zastrzyku zależności zamiast instynktowania podmodułów podkreśliłoby intencję i prawdopodobnie uniknęło pomyłki TO.
ManuelSchneid3r

To niesamowity przykład, ponieważ po prostu zawija tysiące słów w pigułce, aby zrozumieć samą koncepcję. Reszta to tylko szczegóły różnych scenariuszy, które można mieć (oczywiście wzorzec projektowy nigdy nie obejmie każdego scenariusza).
Syed,

41

Jak wyjaśniono w poprzedniej odpowiedzi, zapewnia on prosty interfejs konsumentowi korzystającemu. Na przykład: „obejrzyj ESPN” jest zamierzoną funkcją. Ale wymaga kilku kroków, takich jak:

  1. W razie potrzeby włącz telewizor;
  2. Sprawdź działanie satelity / kabla;
  3. W razie potrzeby przełącz się na ESPN.

Ale fasada uprości to i zapewni klientowi funkcję „obserwuj ESPN”.


29

Fasada ukrywa złożoność systemu i zapewnia interfejs dla klienta, z którego klient może uzyskać dostęp do systemu.

public class Inventory {
public String checkInventory(String OrderId) {
    return "Inventory checked";
}
}

public class Payment {
public String deductPayment(String orderID) {
    return "Payment deducted successfully";
}
}


public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();

public void placeOrder(String orderId) {
    String step1 = inventry.checkInventory(orderId);
    String step2 = pymt.deductPayment(orderId);
    System.out
            .println("Following steps completed:" + step1
                    + " & " + step2);
   }
}

public class Client {
       public static void main(String args[]){
         OrderFacade orderFacade = new OrderFacade();
         orderFacade.placeOrder("OR123456");
         System.out.println("Order processing completed");
       }
  }

Czy podsystemy mogą komunikować się ze sobą bez przechodzenia przez OrderFacade? W twoim przykładzie pomiędzy Paymenti Inventory?
Isuru

19

Krótkie i proste wyjaśnienie:

  • Wzór elewacji zapewnia ujednolicony interfejs dla zestawu interfejsów w podsystemie.
  • Fasada definiuje interfejs wyższego poziomu, który ułatwia korzystanie z podsystemu.

Spróbuj zrozumieć scenariusz z
fasadą i bez: Jeśli chcesz przelać pieniądze z konta 1 na konto 2, dwa podsystemy, które chcesz wywołać, to: wycofaj się z konta 1 i wpłać na konto 2.

z fasadą i bez


Proste i jasne wyjaśnienie i przykład, dzięki! Czy możesz również wyjaśnić, co definiuje podsystem? Gdy podsystem może składać się ze stosunkowo niepowiązanych podklas / funkcji, twoja definicja ma zastosowanie do prawie każdej klasy. Czy klasy podsystemu muszą być ściśle powiązane, np. Z modułem lub biblioteką, które można nazwać elewacją fasadą?
Benni

@Benni Tak, podsystem (byłaby to klasa) może składać się ze stosunkowo niezwiązanych funkcji, ale fasada jest klasą, w której decydujesz, które konkretne funkcje wywołać. Chcesz zarezerwować „pakiet wycieczek”, wybierasz hotel, taksówkę, lot w jednym miejscu / formie, a następnie wewnętrznie fasada przywołuje funkcje różnych odpowiednich klas i zwraca wynik końcowy. Czyż nie
Arun Raaj,

10

Fasady nie należy opisywać jako klasy zawierającej wiele innych klas. W rzeczywistości jest interfejsem do tych klas i powinien ułatwić korzystanie z nich, w przeciwnym razie klasa elewacji będzie bezużyteczna.


7

Jeśli chodzi o twoje zapytania:

Czy Facade jest klasą, która zawiera wiele innych klas?

Tak. Jest to opakowanie dla wielu podsystemów w zastosowaniu.

Co sprawia, że ​​jest to wzór projektowy? Dla mnie jest to jak normalna klasa

Wszystkie wzorce projektowe również są normalnymi klasami. @ Unmesh Kondolikar poprawnie odpowiedział na to zapytanie.

Czy możesz mi wyjaśnić tę fasadę, jestem nowy w projektowaniu wzorów.

Według GoF wzór projektowania elewacji jest zdefiniowany jako:

Zapewnij zunifikowany interfejs do zestawu interfejsów w podsystemie. Wzór fasady definiuje interfejs wyższego poziomu, który ułatwia korzystanie z podsystemu

Elewacji wzór jest zazwyczaj stosowane w przypadku gdy:

  1. Aby uzyskać dostęp do złożonego systemu, wymagany jest prosty interfejs.
  2. Abstrakcje i implementacje podsystemu są ściśle powiązane.
  3. Potrzebujesz punktu wejścia do każdego poziomu oprogramowania warstwowego.
  4. System jest bardzo złożony lub trudny do zrozumienia.

Weźmy prawdziwy przykład witryny cleartrip .

Ta strona internetowa oferuje opcje rezerwacji

  1. Loty
  2. Hotele
  3. Loty + hotele

Fragment kodu:

import java.util.*;

public class TravelFacade{
    FlightBooking flightBooking;
    TrainBooking trainBooking;
    HotelBooking hotelBooking;

    enum BookingType {
        Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
    }; 

    public TravelFacade(){
        flightBooking = new FlightBooking();
        trainBooking = new TrainBooking();
        hotelBooking = new HotelBooking();        
    }
    public void book(BookingType type, BookingInfo info){
        switch(type){
            case Flight:
                // book flight;
                flightBooking.bookFlight(info);
                return;
            case Hotel:
                // book hotel;
                hotelBooking.bookHotel(info);
                return;
            case Train:
                // book Train;
                trainBooking.bookTrain(info);
                return;
            case Flight_And_Hotel:
                // book Flight and Hotel
                flightBooking.bookFlight(info);
                hotelBooking.bookHotel(info);
                return;
             case Train_And_Hotel:
                // book Train and Hotel
                trainBooking.bookTrain(info);
                hotelBooking.bookHotel(info);
                return;                
        }
    }
}
class BookingInfo{
    String source;
    String destination;
    Date    fromDate;
    Date     toDate;
    List<PersonInfo> list;
}
class PersonInfo{
    String name;
    int       age;
    Address address;
}
class Address{

}
class FlightBooking{
    public FlightBooking(){

    }
    public void bookFlight(BookingInfo info){

    }
}
class HotelBooking{
    public HotelBooking(){

    }
    public void bookHotel(BookingInfo info){

    }
}
class TrainBooking{
    public TrainBooking(){

    }
    public void bookTrain(BookingInfo info){

    }
}

Wyjaśnienie:

  1. FlightBooking, TrainBooking and HotelBooking są różne podsystemy dużego systemu: TravelFacade

  2. TravelFacade oferuje prosty interfejs do rezerwacji jednej z poniższych opcji

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
  3. Book API z TravelFacade wywołuje wewnętrznie poniżej API podsystemów

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. W ten sposób TravelFacadezapewnia prostsze i łatwiejsze API bez ujawniania API podsystemu.

Najważniejsze rzeczy na wynos: (z artykułu Journaldev autorstwa Pankaja Kumara )

  1. Wzór elewacji bardziej przypomina pomocnika do aplikacji klienckich
  2. Fasada wzór może być stosowany w dowolnym punkcie rozwoju, zwykle , gdy liczba interfejsów rosnąć i układ pobiera ośrodku X .
  3. Interfejsy podsystemów nie znają Fasady i nie powinny mieć żadnego odniesienia do interfejsu Fasady
  4. Wzór elewacji powinien być stosowany do podobnych interfejsów , jego celem jest zapewnienie jednego interfejsu zamiast wielu interfejsów wykonujących podobne zadania

Zajrzyj również do artykułu o zaopatrzeniu, aby lepiej zrozumieć.


6

Wzór fasady jest opakowaniem wielu innych interfejsów, dzięki czemu powstaje prostszy interfejs.

Wzorce projektowe są przydatne, ponieważ rozwiązują powtarzające się problemy i ogólnie upraszczają kod. W zespole programistów, którzy zgadzają się stosować te same wzorce, poprawia to wydajność i zrozumienie podczas wzajemnego utrzymywania kodu.

Spróbuj przeczytać o więcej wzorach:

Wzór elewacji: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

lub bardziej ogólnie: http://www.dofactory.com/Patterns/Patterns.aspx


nileshgule.com/2012/07/facade-design-pattern.html Próbowałem tutaj opisać wzór projektu fasady na przykładzie procesu weryfikacji kredytu mieszkaniowego.
Nilesh Gule,

6

Dodatkowym zastosowaniem wzoru fasady może być zmniejszenie krzywej uczenia się zespołu. Dam ci przykład:

Załóżmy, że twoja aplikacja musi współdziałać z MS Excel, wykorzystując model obiektowy COM dostarczony przez Excel. Jeden z członków twojego zespołu zna wszystkie interfejsy API Excela i tworzy na nim fasadę, która spełnia wszystkie podstawowe scenariusze aplikacji. Żaden inny członek zespołu nie musi poświęcać czasu na naukę Excel API. Zespół może korzystać z elewacji bez znajomości elementów wewnętrznych lub wszystkich obiektów MS Excel zaangażowanych w realizację scenariusza. Czyż to nie wspaniałe?

W ten sposób zapewnia uproszczony i ujednolicony interfejs na złożonym podsystemie.


5

Kolejny przykład fasady: powiedz, że Twoja aplikacja łączy się z bazą danych i wyświetla wyniki w interfejsie użytkownika. Fasady można użyć do skonfigurowania aplikacji, np. W bazie danych lub z próbnymi obiektami. Tak więc wykonasz wszystkie wywołania bazy danych do klasy elewacji, gdzie odczyta konfigurację aplikacji i zdecyduje się uruchomić zapytanie db lub zwróci próbny obiekt. w ten sposób aplikacja staje się niezależna od db w przypadku, gdy db jest niedostępny.


5

Fasada ujawnia uproszczone funkcje, które są najczęściej wywoływane, a implementacja ukrywa złożoność, z którą klienci musieliby sobie poradzić. Ogólnie implementacja wykorzystuje wiele pakietów, klas i funkcji. Dobrze napisane fasady sprawiają, że bezpośredni dostęp do innych klas jest rzadkością. Na przykład, kiedy odwiedzam bankomat i wypłacam pewną kwotę. Bankomat ukrywa, czy leci bezpośrednio do banku, czy jest w drodze wynegocjowanej sieci dla banku zewnętrznego. Bankomat działa jak fasada zużywająca wiele urządzeń i podsystemów, z którymi jako klient nie muszę się bezpośrednio zajmować.


5

Istnieje bardzo dobry przykład tego wzorca - rozrusznik samochodowy .

Jako kierowcy po prostu włączamy kluczyk i samochód zaczyna. Tak proste, jak to możliwe. Za kulisami zaangażowanych jest wiele innych systemów samochodowych (takich jak akumulator, silnik, paliwo itp.), Aby samochód mógł się pomyślnie uruchomić, ale są one ukryte za rozrusznikiem.

Jak widać, rozrusznik samochodowy to fasada. Daje nam łatwy w użyciu interfejs, nie martwiąc się o złożoność wszystkich innych systemów samochodowych.

Podsumujmy:

Wzór fasady upraszcza i ukrywa złożoność dużych bloków kodu lub interfejsów API, zapewniając bardziej przejrzysty, zrozumiały i łatwy w użyciu interfejs.


4

Fasada to klasa o poziomie funkcjonalności między zestawem narzędzi a kompletną aplikacją, oferująca uproszczone użycie klas w pakiecie lub podsystemie. Celem wzoru Fasada jest zapewnienie interfejsu, który sprawia, że ​​podsystem jest łatwy w użyciu. - Wyciąg z wzorców projektowych książki w języku C #.


4

Fasada omawia enkapsulację złożonego podsystemu w jednym obiekcie interfejsu. Zmniejsza to krzywą uczenia się niezbędną do skutecznego wykorzystania podsystemu. Promuje również oddzielenie podsystemu od jego potencjalnie wielu klientów. Z drugiej strony, jeśli Fasada jest jedynym punktem dostępu do podsystemu, ograniczy funkcje i elastyczność, których mogą potrzebować „zaawansowani użytkownicy”.

Źródło: https://sourcemaking.com/design_patterns/facade


3

Wzorzec projektowy jest ogólnym rozwiązaniem wielokrotnego użytku dla często występującego problemu w danym kontekście w projektowaniu oprogramowania.

Wzór projektowania elewacji jest wzorem strukturalnym, ponieważ określa sposób tworzenia relacji między klasami lub elementami. Wzorzec projektu elewacji służy do zdefiniowania uproszczonego interfejsu do bardziej złożonego podsystemu.

Wzór elewacji jest idealny podczas pracy z dużą liczbą współzależnych klas lub z klasami, które wymagają użycia wielu metod, szczególnie gdy są one skomplikowane w użyciu lub trudne do zrozumienia. Klasa elewacji to „opakowanie” zawierające zestaw elementów, które są łatwe do zrozumienia i proste w użyciu. Członkowie ci uzyskują dostęp do podsystemu w imieniu użytkownika fasady, ukrywając szczegóły implementacji.

Wzorzec projektowania elewacji jest szczególnie użyteczny podczas owijania podsystemów, które są źle zaprojektowane, ale nie można ich ponownie przetworzyć, ponieważ kod źródłowy jest niedostępny lub istniejący interfejs jest szeroko stosowany. Czasami możesz zdecydować się na wdrożenie więcej niż jednej fasady, aby zapewnić podzbiory funkcjonalności do różnych celów.

Jednym z przykładów zastosowania wzoru fasady jest integracja strony internetowej z aplikacją biznesową. Istniejące oprogramowanie może zawierać duże ilości logiki biznesowej, do której należy uzyskać dostęp w określony sposób. Strona internetowa może wymagać jedynie ograniczonego dostępu do tej logiki biznesowej. Na przykład witryna internetowa może wymagać pokazania, czy pozycja na sprzedaż osiągnęła ograniczony poziom zapasów. Metoda IsLowStock klasy fasady może zwrócić wartość logiczną, aby to wskazać. Za kulisami ta metoda może ukrywać złożoność przetwarzania aktualnego zapasu fizycznego, zapasu przychodzącego, przydzielonych pozycji i niskiego poziomu zapasów dla każdego elementu.



2

Po prostu tworzy opakowanie do wywoływania wielu metod. Masz klasę A z metodami x () i y () oraz klasę B z metodami k () i z (). Chcesz wywołać x, y, z jednocześnie, aby to zrobić za pomocą wzorca fasady, po prostu utwórz klasę fasady i utwórz metodę, powiedzmy xyz (). Zamiast wywoływać każdą metodę (x, yiz z osobno), wystarczy wywołać metodę otoki (xyz ()) klasy fasady, która wywołuje te metody.

Podobny wzór jest repozytorium, ale dotyczy to głównie warstwy dostępu do danych.


1

Zasadniczo jest to system usuwania pojedynczych okien. Każdą pracę, którą przekaże on konkretnej metodzie w innej klasie, przypisujesz.



1

Wzór elewacji zapewnia zunifikowany interfejs do grupy interfejsów podsystemu. Fasada definiuje interfejs wysokiego poziomu, który upraszcza pracę z podsystemem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.