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 ?
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 ?
Odpowiedzi:
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 view
to, co jest easy to use
. Jest to również decouples
kod, 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.
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();
}
}
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:
Ale fasada uprości to i zapewni klientowi funkcję „obserwuj ESPN”.
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");
}
}
OrderFacade
? W twoim przykładzie pomiędzy Payment
i Inventory
?
Krótkie i proste wyjaśnienie:
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.
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:
Weźmy prawdziwy przykład witryny cleartrip .
Ta strona internetowa oferuje opcje rezerwacji
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:
FlightBooking, TrainBooking and HotelBooking
są różne podsystemy dużego systemu: TravelFacade
TravelFacade
oferuje prosty interfejs do rezerwacji jednej z poniższych opcji
Flight Booking
Train Booking
Hotel Booking
Flight + Hotel booking
Train + Hotel booking
Book API z TravelFacade wywołuje wewnętrznie poniżej API podsystemów
flightBooking.bookFlight
trainBooking.bookTrain(info);
hotelBooking.bookHotel(info);
W ten sposób TravelFacade
zapewnia prostsze i łatwiejsze API bez ujawniania API podsystemu.
Najważniejsze rzeczy na wynos: (z artykułu Journaldev autorstwa Pankaja Kumara )
Zajrzyj również do artykułu o zaopatrzeniu, aby lepiej zrozumieć.
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
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.
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.
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ć.
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.
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 #.
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”.
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.
Wszystkie wzorce projektowe to niektóre klasy ułożone w taki lub inny sposób, które pasują do określonej aplikacji. Celem wzoru fasady jest ukrycie złożoności operacji lub operacji. Możesz zobaczyć przykład i nauczyć się wzoru fasady ze strony http://preciselyconcise.com/design_patterns/facade.php
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.
Wzór elewacji objęty jest wzorem wzoru strukturalnego. W skrócie Fasada oznacza wygląd zewnętrzny. Oznacza to, że we wzorze fasady coś ukrywamy i pokazujemy tylko to, czego faktycznie potrzebuje klient. Czytaj więcej na poniższym blogu: http://www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html
Wzór elewacji zapewnia zunifikowany interfejs do grupy interfejsów podsystemu. Fasada definiuje interfejs wysokiego poziomu, który upraszcza pracę z podsystemem.