Czym jest Fasada Design Pattern?

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

Co czyni go wzorcem projektowym? Dla mnie to jak normalna Klasa.

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

Author: LolPython, 2011-03-09

19 answers

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

Wzórfasady upraszcza interfejs do złożonego systemu, ponieważ zazwyczaj składa się on ze wszystkich klas, które składają się na podsystemy złożonego systemu.

Elewacja chroni użytkownika przed skomplikowane szczegóły systemu i dostarcza im simplified view z niego, który jest easy to use. To także decouples kod, który wykorzystuje system ze szczegółów podsystemów, co ułatwia późniejsze modyfikacje systemu.

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

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

Również, co jest ważne podczas uczenia się wzorców projektowych jest w stanie rozpoznać, który wzór pasuje do danego problemu, a następnie go używać odpowiednio. Bardzo często nadużywa się wzoru lub próbuje dopasować go do jakiegoś problemu tylko dlatego, że go znasz. Bądź świadomy tych pułapek podczas nauki\korzystanie z wzorców projektowych.

 163
Author: Unmesh Kondolikar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-27 22:55:48

Wikipedia ma świetny przykład wzoru elewacji.

/* 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();
    }
}
 83
Author: egezer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 15:12:24

Jak wyjaśniono w poprzedniej odpowiedzi, zapewnia prosty interfejs do klienta. Na przykład: "oglądaj ESPN" jest zamierzoną funkcją. Ale składa się z kilku kroków takich jak:

  1. Włącz telewizor w razie potrzeby;
  2. sprawdzanie działania satelity/kabla;
  3. W razie potrzeby Przełącz na ESPN.

Ale fasada uprości to i po prostu dostarczy klientowi funkcję "watch ESPN".

 35
Author: Aravind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-08 17:10:29

Fasada ukrywa złożoność systemu i zapewnia interfejs do 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");
       }
  }
 27
Author: KaviK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-08 17:12:28

Fasadę nie należy opisywać jako klasę, która zawiera wiele innych klas. W rzeczywistości jest to interfejs do tych klas i powinno ułatwić korzystanie z klas, w przeciwnym razie Klasa fasady jest bezużyteczna.

 10
Author: llMll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 07:12:41

Krótkie i proste wyjaśnienie:

  • Wzór elewacji zapewnia zunifikowany interfejs do zestawu interfejsów) w podsystemie.
  • Facade definiuje interfejs wyższego poziomu, który sprawia, że podsystem łatwiejszy w użyciu.

Spróbuj zrozumieć scenariusz z fasadą i bez:
Jeśli chcesz przelać pieniądze z accout1 na account2, to dwa podsystemy, które należy wywołać, to wypłata z account1 i wpłata na account2.

z elewacją i bez

 7
Author: Arun Raaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 08:18:06

Wzór elewacji jest owijką wielu innych interfejsów w wyniku czego 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ę na stosowanie tych samych wzorców, poprawia to wydajność i zrozumienie podczas utrzymywania drugiego kodu.

Spróbuj przeczytać więcej wzorów:

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

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

 6
Author: Aim Kai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 07:21:30

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

Załóżmy, że Twoja aplikacja musi współdziałać z MS Excel, korzystając z modelu obiektowego com dostarczonego przez Excel. Jeden z członków Twojego zespołu zna wszystkie interfejsy API programu Excel i tworzy na nich fasadę, która spełnia wszystkie podstawowe scenariusze aplikacji. Żaden inny członek zespołu nie musi poświęcać czasu na naukę interfejsu API programu Excel. Zespół może korzystać fasada bez znajomości 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 szczycie złożonego podsystemu.

 5
Author: Anand Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 10:19:12

Fasada eksponuje uproszczone funkcje, które są najczęściej nazywane, a implementacja ukrywa złożoność, z którą klienci w przeciwnym razie mieliby do czynienia. Ogólnie implementacja używa wielu pakietów, klas i funkcji. Dobrze napisane fasady sprawiają, że bezpośredni dostęp do innych klas jest rzadki. Na przykład, gdy odwiedzam bankomat i wypłacam pewną kwotę. Bankomat ukrywa, czy idzie prosto do posiadanego banku, czy też przechodzi przez sieć wynegocjowaną dla Zewnętrznego Banku. Na Bankomat działa jak fasada pochłaniająca wiele urządzeń i podsystemów, z którymi jako klient nie muszę się bezpośrednio zmagać.

 5
Author: ManojPatra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-26 18:29:58

Odnośnie Twoich zapytań:

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

Tak. Jest to wrapper dla wielu podsystemów w aplikacji.

Co czyni go wzorcem projektowym? Dla mnie jest to jak normalna Klasa

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

Możesz mi wyjaśnić o tej fasadzie, jestem nowy w projektowaniu wzory.

Według GoF, Fasada wzór projektu jest defind jako:

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

Wzórfasady jest zwykle używany, gdy:

  1. prosty interfejs jest wymagany do uzyskania dostępu do złożonego systemu.
  2. abstrakcje i implementacje podsystemu są ściśle / align = "left" /
  3. potrzebny jest punkt wejścia do każdego poziomu oprogramowania warstwowego.
  4. System jest bardzo złożony lub trudny do zrozumienia.
[[7]}weźmy przykład prawdziwego słowa cleartrip strona internetowa.

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. Rezerwuj API z TravelFacade wewnętrznie wywołania poniżej API podsystemów

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. W ten sposób TravelFacade zapewnia prostsze i łatwiejsze API bez ujawniania podsystemowych interfejsów API.

Najważniejsze informacje: (z journaldev artykuł autorstwa Pankaj Kumar )

  1. wzór elewacji jest bardziej jak Pomocnik dla aplikacji klienckich
  2. wzór elewacji można zastosować w dowolnym punkcie zabudowy, Zwykle gdy liczba interfejsów rośnie i system staje się complex.
  3. Interfejsy podsystemu nie są świadome elewacji i są Nie powinno mieć żadnych odniesień do interfejsu fasady
  4. wzór elewacji powinien być stosowany dla podobnego rodzaju interfejsów, jego celem jest zapewnienie jednego interfejs zamiast wielu interfejsów, które wykonują podobne zadania]}
[[7]} spójrz na sourcemaking artykuł zbyt dla lepszego zrozumienia.
 5
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 17:48:24

Fasada to klasa o poziomie funkcjonalności, która leży pomiędzy zestawem narzędzi a kompletną aplikacją, oferująca uproszczone korzystanie z klas w pakiecie lub podsystemie. Intencją wzoru elewacji jest zapewnienie interfejsu, który sprawia, że podsystem jest łatwy w użyciu. -- Wyciąg z Książki wzorce projektowe w C#.

 4
Author: Sean Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 07:19:32

Facade omawia enkapsulację złożonego podsystemu w obrębie jednego obiektu interfejsu. Zmniejsza to krzywą uczenia się niezbędną do skutecznego wykorzystania podsystemu. Promuje również oddzielenie podsystemu od potencjalnie wielu klientów. Z drugiej strony, jeśli fasada jest jedynym punktem dostępowym dla podsystemu, ograniczy to funkcje i elastyczność, których mogą potrzebować" zaawansowani użytkownicy".

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

 4
Author: Pang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 07:20:06

Kolejny przykład fasady: powiedzmy, że Twoja aplikacja łączy się z bazą danych i wyświetla wyniki w interfejsie użytkownika. Możesz użyć fasady, aby skonfigurować aplikację, tak jak w przypadku uruchamiania przy użyciu bazy danych lub z mock objects. Więc wykonasz wszystkie wywołania bazy danych do klasy facade, gdzie odczyta konfigurację aplikacji i zdecyduje się odpalić zapytanie db lub zwrócić obiekt makiety. w ten sposób aplikacja staje się niezależna od db w przypadku, gdy db jest niedostępne.

 3
Author: aishu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-04 07:02:52

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

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

Wzór elewacji jest idealny przy pracy z dużą liczbą klas współzależnych, lub z klasami, które wymagają stosowanie wielu metod, szczególnie gdy są one skomplikowane w użyciu lub trudne do zrozumienia. Klasa fasady to" owijarka", która zawiera zestaw elementów, które są łatwo zrozumiałe i proste w użyciu. Członkowie ci uzyskują dostęp do podsystemu w imieniu użytkownika fasady, ukrywając szczegóły implementacji.

Wzór konstrukcyjny fasady jest szczególnie przydatny podczas zawijania podsystemów, które są źle zaprojektowane, ale nie mogą być refakturowane, 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.

Przykładem zastosowania wzoru elewacji jest integracja strony internetowej z aplikacją biznesową. Istniejące oprogramowanie może zawierać duże ilości logiki biznesowej, które muszą być dostępne w określony sposób. Witryna internetowa może wymagać jedynie ograniczonego dostępu do tej logiki biznesowej. Na przykład witryna internetowa może wymagać pokazania, czy Element dla sprzedaż osiągnęła ograniczony poziom zapasów. Metoda IsLowStock klasy facade może zwrócić wartość logiczną, aby to wskazać. Za kulisami metoda ta może ukrywać złożoność przetwarzania bieżącego fizycznego zapasów, przychodzących zapasów, przydzielonych artykułów i niskiego poziomu zapasów dla każdego artykułu.

 3
Author: Program-Me-Rev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-08 16:59:47

Istnieje bardzo dobry przykład wzorca - Rozrusznik Samochodowy .

Jako kierowcy, po prostu włączamy kluczyk i samochód startuje. Tak proste, jak to tylko możliwe. Za kulisami bierze udział wiele innych systemów samochodowych (jak akumulator, silnik, paliwo itp.), aby samochód zaczął się pomyślnie, ale są ukryte za rozrusznikiem.

Jak widać, rozrusznik to Fasada. Daje nam łatwy w użyciu interfejs, bez martwienia się o złożoność wszystkie inne systemy samochodowe.

Podsumujmy:

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

 3
Author: Jordan Enev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 13:39:01

Wszystkie wzorce projektowe to niektóre klasy ułożone w taki lub inny sposób, który pasuje do konkretnej aplikacji. Celem wzoru elewacji jest ukrycie złożoności operacji lub operacji. Możesz zobaczyć przykład i poznać wzór elewacji z http://preciselyconcise.com/design_patterns/facade.php

 2
Author: Sai Sunder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 17:06:29

Jest to w zasadzie system prześwitu pojedynczego okna.Przypisujesz dowolną pracę, która będzie delegowana do określonej metody w innej klasie.

 1
Author: Saurabh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 06:47:53

Wzór konstrukcyjny elewacji wchodzi w skład wzoru konstrukcyjnego. W skrócie Fasada oznacza wygląd zewnętrzny. Oznacza to, że w projekcie elewacji coś ukrywamy i pokazujemy tylko to, czego właściwie wymaga klient. Czytaj więcej na blogu poniżej: http://www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html

 1
Author: user1694660,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-12 16:36:02

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

 1
Author: Taras Melnyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-20 18:49:00