Wzorzec fasady (lub wzorzec elewacji) jest wzorcem projektowym oprogramowania powszechnie używanym w programowaniu zorientowanym obiektowo. Nazwa jest przez analogię do fasady architektonicznej.
Fasada jest obiektem, który zapewnia uproszczony interfejs do większego ciała kodu, takiego jak biblioteka klas. Fasada może:
- uczynić bibliotekę oprogramowania łatwiejszą w użyciu, zrozumieniu i testowaniu, ponieważ fasada posiada wygodne metody dla typowych zadań;
- uczynić bibliotekę bardziej czytelną, z tego samego powodu;
- zmniejszyć zależności kodu zewnętrznego od wewnętrznego działania biblioteki, ponieważ większość kodu korzysta z fasady, co pozwala na większą elastyczność w rozwijaniu systemu;
- opasać źle zaprojektowaną kolekcję API jednym dobrze zaprojektowanym API.
Wzorzec projektowy Fasada jest często używany, gdy system jest bardzo złożony lub trudny do zrozumienia, ponieważ system ma dużą liczbę współzależnych klas lub jego kod źródłowy jest niedostępny. Ten wzorzec ukrywa złożoność większego systemu i zapewnia prostszy interfejs dla klienta. Zazwyczaj obejmuje on pojedynczą klasę opakowującą, która zawiera zestaw członków wymaganych przez klienta. Członkowie ci uzyskują dostęp do systemu w imieniu klienta fasady i ukrywają szczegóły implementacji.
Usage
Fasada jest używana, gdy pożądany jest łatwiejszy lub prostszy interfejs do obiektu bazowego. Alternatywnie, adapter może być użyty, gdy wrapper musi przestrzegać określonego interfejsu i musi wspierać polimorficzne zachowanie. Dekorator umożliwia dodanie lub zmianę zachowania interfejsu w czasie wykonywania.
Pattern | Intentent |
---|---|
Adapter | Konwertuje jeden interfejs na inny tak, aby pasował do tego, czego oczekuje klient |
Dekorator | Dynamicznie dodaje odpowiedzialność do interfejsu przez zawijanie oryginalnego kodu |
Facade | Dostarcza uproszczony interfejs |
Wzorzec fasady jest zwykle używany, gdy:
- prosty interfejs jest wymagany do uzyskania dostępu do złożonego systemu;
- abstrakcje i implementacje podsystemu są ściśle sprzężone;
- potrzeba punktu wejścia do każdego poziomu warstwowego oprogramowania; lub
- system jest bardzo złożony lub trudny do zrozumienia.
Struktura
Facade: Klasa Fasada abstrahuje Pakiety 1, 2, i 3 od reszty aplikacji.Klienci: Obiekty używają wzorca Fasady, aby uzyskać dostęp do zasobów z Pakietów.
Przykład
Jest to abstrakcyjny przykład tego, jak klient („ty”) wchodzi w interakcję z fasadą („komputer”) do złożonego systemu (wewnętrzne części komputera, takie jak procesor i dysk twardy).
/* Complex parts */class CPU { freeze() { /* code here */ } jump(position) { /* code here */ } execute() { /* code here */ }}class Memory { load(position, data) { /* code here */ }}class HardDrive { read(lba, size) { /* code here */ }}/* Facade */class ComputerFacade { constructor() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); } start() { this.processor.freeze(); this.ram.load(this.BOOT_ADDRESS, this.hd.read(this.BOOT_SECTOR, this.SECTOR_SIZE)); this.processor.jump(this.BOOT_ADDRESS); this.processor.execute(); }}/* Client */let computer = new ComputerFacade();computer.start();
.