Fasada (wzorzec projektowy): Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
PG (dyskusja | edycje)
m drobne redakcyjne
dostosowanie do zaleceń edycyjnych, dodanie diagramu
Linia 1:
'''Wzorzec fasadyFasada''' to w [[inżynieria oprogramowania|inżynierii oprogramowania]] jeden z [[Wzorzec projektowy (informatyka)|wzorców projektowych]] należący do grupy ''wzorców strukturalnych''. JestSłuży on pomyślany jakodo środekujednolicenia dostępu do złożonego systemu prezentującypoprzez nawystawienie zewnątrzuproszczonego, uproszczony lub uporządkowanyuporządkowanego [[API (informatyka)|interfejsinterfejsu programistycznyprogramistycznego]], który ułatwia jego użycie.
{{Dopracować|Patrz: [[Wikiprojekt:Informatyka/Zalecenia edycyjne - Wzorce projektowe|Zalecenia edycyjne dla wzorców projektowych]]}}
 
'''Wzorzec fasady''' to w [[inżynieria oprogramowania|inżynierii oprogramowania]] jeden z [[Wzorzec projektowy (informatyka)|wzorców projektowych]] należący do grupy ''wzorców strukturalnych''. Jest on pomyślany jako środek dostępu do złożonego systemu prezentujący na zewnątrz uproszczony lub uporządkowany [[API (informatyka)|interfejs programistyczny]].
 
== Problem ==
Czasami istnieje potrzeba skorzystania z istniejącego już, rozbudowanego systemu. Obojętnie czy system ten jest [[biblioteka (informatyka)|biblioteką programistyczną]] na której chcemy zbudować swoją [[aplikacja (informatyka)|aplikację]], czy jest rozbudowanym programem działającym z [[Interfejs tekstowy|wiersza poleceń]] do którego robimy nakładkę [[Interfejs graficzny|GUI]], korzystne jest zdefiniowanie obiektu pośredniczącego między starym systemem, a systemem, który z niego korzysta.
 
Rozważmy kompilator napisany z wykorzystaniem reguł [[Programowanie obiektowe|programowania obiektowego]]. Znajdziemy w nim klasy i obiekty reprezentujące [[parser]], [[lekser]], bufory na kod wynikowy i wiele innych elementów. Interfejs całego systemu posiada duże możliwości, lecz jest skomplikowany, tymczasem większość jego użytkowników będzie zainteresowana po prostu uruchomieniem [[Kompilacja (informatyka)|kompilacji]] określonego pliku i pobrania wyniku. Rozwiązaniem jest zastosowanie wzorca ''Fasada'' do stworzenia dodatkowego [[Obiekt (programowanie obiektowe)|obiektu]], który pozwala szybko uruchomić najbardziej typowe zadania, jednocześnie nie ukrywając złożoności systemu przed tymi, którzy jej faktycznie potrzebują.
Wzorzec fasady stosuje się aby:
* ukryć złożoność tworzonego przez siebie systemu przez dostarczenie udokumentowanego, publicznego API. Skutkiem takiego podejścia jest zdefiniowanie dozwolonego dostępu do obiektów systemu, dzięki czemu redukujemy liczbę możliwych przypadków ich błędnego użycia. Inną korzyścią z zastosowania w tym przypadku fasady jest to, że programiści korzystający z systemu muszą przyswoić sobie tylko API fasady a nie wszystkich obiektów systemu.
* uprościć używanie cudzej biblioteki programistycznej przez zdefiniowanie wygodnych i dostosowanych do konkretnego zastosowania [[metoda (programowanie obiektowe)|metod]] pośredniczących między systemami. Ubocznym skutkiem takiego uproszczenia jest zwiększenie czytelności swojego [[kod źródłowy|kodu]].
* poprawić użyteczność biblioteki ze źle skonstruowanym API przez stworzenie nakładki, która dostarcza nowe, uporządkowane API
 
== Budowa ==
W ogólności wzorzec fasady pozwala wykorzystać podzbiór możliwości skomplikowanego systemu w prostszy, specyficzny dla danego zastosowania sposób.
 
[[Plik:FasadaFacade classes pl.svg|thumb|right|500px400px|Przykład[[Diagram użyciaklas]] wzorca fasady''Strategia'']]
== Rozwiązanie ==
Fasada jest obiektem pośredniczącym między klasami [[Klient-serwer|klientów]] żądającymi funkcjonalności, a klasami dostarczającymi jej elementów. Jako że zwykle w systemie potrzeba tylko jednej fasady, najczęściej definiuje się ją jako [[Wzorzec singletonu|singleton]].
 
We wzorcu wyróżniamy następujące elementy:
Obiekt fasady wie, które klasy ukrywanego systemu są odpowiedzialne za wykonanie danego żądania i wykonuje odpowiednie wywołania do właściwych obiektów systemu. Natomiast ukrywane klasy wykonują zlecone zadania nie posiadając żadnej wiedzy o fasadzie.
 
* '''złożony system''' — reprezentowany na diagramie przez [[Klasa (programowanie obiektowe)|klasy]] <code>Element1</code> do <code>Element5</code>. Chcemy uprościć dostęp do niego,
Typowym scenariuszem użycia obiektu fasady jest:
* '''fasada''' — klasa posiadająca referencje do elementów systemu z [[Metoda (programowanie obiektowe)|metodami]] do wykonywania najczęściej potrzebnych zadań,
# wywoływane jednej z metod fasady przez klasę kliencką
* '''klient''' — dowolny kod zainteresowany wykorzystaniem złożonego systemu.
# wywołanie przez tę metodę sekwencji metod klas dostarczających elementów żądanej przez klienta funkcjonalności
 
Klient komunikuje się z systemem poprzez fasadę, która w jego imieniu wykonuje niezbędne operacje na złożonym systemie. To, czy klient posiada także bezpośredni dostęp do systemu, leży w gestii programisty implementującego wzorzec, ponieważ możliwe jest wykorzystanie go do podziału systemu na warstwy, gdzie fasady służą do uproszczenia i ujednolicenia komunikacji.
Wariantem pkt. 2 jest wywołanie jednej tylko metody dostarczającej funkcjonalności ale z predefiniowanym zestawem parametrów.
 
== Konsekwencje ==
 
* duże zmniejszenie liczby zależności między klientem, a złożonym systemem — jeśli klient nie korzysta bezpośrednio z żadnych elementów ukrytego za fasadą systemu, całość jest łatwiejsza w konserwacji i utrzymaniu,
* wprowadzenie podziału aplikacji na warstwy, który ułatwia niezależny rozwój klienta i złożonego systemu,
* możliwość zablokowania klientowi drogi do bezpośredniego korzystania ze złożonego systemu, jeśli jest to konieczne,
* kod klienta wykorzystującego fasadę jest czytelniejszy i łatwiejszy w zrozumieniu<ref>{{cytuj stronę | url = http://wiki.asp.net/page.aspx/311/facade/ | tytuł = Facade | opublikowany = [http://wiki.asp.net/ ASP.NET Wiki] | data dostępu = 2011-09-16 | język = en}}</ref>,
 
== Przykład ==
 
[[Plik:Fasada.svg|thumb|right|500px|Przykład użycia wzorca fasady]]
Przykładem użycia wzorca fasady może być [[aplikacja (informatyka)|aplikacja]] [[bankomat]]owa, która musi wchodzić w interakcję z systemem bankowym. Skoro aplikacja bankomatowa wykorzystuje tylko niewielką część możliwości systemu bankowego ([[autoryzacja]] [[karta płatnicza|karty]], sprawdzenie stanu [[Rachunek bankowy|konta]], wypłata i ew. wpłata), to można zastosować obiekt fasady, który zasłoni przed zewnętrznymi aplikacjami skomplikowaną strukturę wewnętrzną systemu bankowego. Upraszcza to pisanie aplikacji na bankomaty, a jednocześnie zapewnia lepsze bezpieczeństwo systemu bankowego.
 
{{Przypisy}}
 
== Bibliografia ==
 
{{Bibliografia start}}
# {{cytuj książkę | imię = Erich | nazwisko = Gamma | autor link = Erich Gamma | imię2 = Richard | nazwisko2 = Helm | autor link2 = Richard Helm | imię3 = Ralph | nazwisko3 = Johnson | autor link3 = Ralph Johnson | imię4 = John | nazwisko4 = Vlissides | autor link4 = John Vlissides | tytuł = Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku | wydawca = [http://www.helion.pl Helion] | rok = 2010 | strony = 161-169 |isbn = 978-83-246-2662-5}}
{{Bibliografia stop}}
 
{{Wzorce projektowe}}