Vzorci oblikovanja fasad. Vzorec oblikovanja fasade v PHP. Razprava o vzorcu fasade

Knjiga GoF to opisuje vzorec kot zagotavljanje enotnega vmesnika za več vmesnikov v nekem podsistemu. knjiga " Oblikovalski vzorci"podaja enako razlago in opozarja na dejstvo, da s skrivanjem kompleksnosti podsistema vzorec" Fasada" hkrati pa zagotavlja vse zmožnosti podsistema prek vmesnika, ki je enostaven za uporabo.

Za preprost praktični primer delovanja fasadnega vzorca si predstavljajte pralni stroj s samo dvema cikloma pranja: za zelo umazano perilo in za rahlo umazano perilo.

Za vsak način mora pralni stroj opraviti vnaprej določen nabor operacij: nastaviti temperaturo vode, segreti vodo, nastaviti trajanje cikla pranja, dodati detergent za perilo, dodati belilo, dodati mehčalec itd. Vsak način zahteva drugačen nabor navodil za pranje (različne količine detergenta, višja/nižja temperatura, daljši/krajši cikel ožemanja itd.).

Enostaven vmesnik omogoča dva načina pranja, ki skrivata zapleteno logiko izbire ustrezne temperature vode, trajanja ožemanja in cikla pranja ter različne metode dodajanja detergenta za perilo, belila ali mehčalca.

Uporabniku pralnega stroja ni treba razmišljati o kompleksni logiki pranja stvari (izbira temperature, trajanje cikla itd.). Uporabnik se mora samo odločiti, ali je perilo močno umazano ali ne. To je bistvo vzorca "Fasada". v zvezi z zasnovo pralnih strojev.

Vzorec "Fasada" običajno izvajajo za naslednje namene in primere:

  • zagotoviti enostaven in enoten dostop do podedovanega sistema za upravljanje proizvodnje;
  • ustvariti javni API za razrede, kot je voznik;
  • za zagotavljanje grobega dostopa do razpoložljivih storitev. Storitve so razvrščene kot v zgornjem primeru pralnega stroja;
  • da zmanjšate število omrežnih klicev. Fasada naredi več klicev na podsistem, medtem ko mora oddaljeni odjemalec narediti en klic na fasado;
  • za enkapsulacijo poteka dela in notranjih podrobnosti aplikacije za zagotovitev preprostosti in varnosti.

Mimogrede, fasade včasih izvajajo tudi kot abstraktne enotne tovarne.

Diagram razredov fasade. Kot je razvidno iz diagrama razredov na Slika 3.1 Fasadni vzorec zagotavlja preprost vmesnik do osnovnega sistema, medtem ko zajema zapleteno logiko.

Slika 3.1. Diagram razredov vzorca "Fasada".

Fasada je vedenjski oblikovalski vzorec. Ta vzorec vam omogoča, da skrijete kompleksnost sistema tako, da zmanjšate vse možne klice na en sam objekt, ki jih prenese na ustrezne sistemske objekte.

Najenostavnejša shema delovanja vzorca:

Predstavljajmo si, da pišemo programsko opremo za mikrovalovno pečico. Za poenostavitev si predstavljajmo, da ima samo naslednje funkcije: zavijanje levo in desno, nastavitev zahtevane moči, obveščanje o začetku in koncu dela.

Če želite pripraviti okusno jed, nekaj pogreti ali odmrzniti, morate izvesti določeno število različnih dejanj v določenem zaporedju. Na primer, pri odmrzovanju je treba, začenši z visokimi močmi, večkrat ponastaviti moč, medtem ko vrtite ploščad z izdelkom.

Če bi moral uporabnik sam slediti vsakemu koraku postopka, bi bilo to zelo zamudno in neučinkovito. Navsezadnje vsi vedo, da je v sodobni mikrovalovni pečici dovolj, da izberete želeni program in pritisnete start, po katerem bo naredil vse, kar je potrebno, in po zaključku bo obvestil uporabnika.

Vzorec oblikovanja fasade obravnava prav takšne primere. Omogoča vam, da skrijete vso zapletenost procesa za preprostim vmesnikom.

Ustvarimo razrede za delovanje mikrovalovnega pogona (vrtenje), napajanje in obveščanje.

V voznem razredu bosta samo 2 akciji: zavijanje desno in zavijanje levo.

Class Drive ( public void TurlLeft() ( Console.WriteLine("Rotate Left"); ) public void TurlRight() ( Console.WriteLine("Rotate Right"); ) )

V razredu, ki določa moč, je dodana lastnost za pridobivanje in nastavitev zahtevane moči dela.

Moč razreda ( private int _power; public int MicrowavePower ( get ( return _power; ) set ( _power = value; Console.WriteLine("Power set (0)w ", _power); ) ) )

V razred obveščanja so dodane metode za obveščanje o začetku in koncu dela.

Class Notification ( public void StopNotification() ( Console.WriteLine("Peak-peak-peak - operacija je končana"); ) public void StartNotification() ( Console.WriteLine("Peak - proces kuhanja se je začel"); ) )

Ostaja le še implementacija samega razreda mikrovalovne pečice. V tem primeru bo to tudi fasada. Pri pouku izvajamo metode odmrzovanja in segrevanja živil.

Razred Microwave ( private Drive _drive; private Power _power; private Notification _notification; public Microwave(Drive drive, Power power, Notification notification) ( _drive = pogon; _power = power; _notification = notification; ) public void Defrost() ( _notification.StartNotification () ; _drive.TurlRight(); _power.MicwavePower = 0; _notification.StopNotification(); ) public void Heating() ( _notification.StartNotification(); _power.MicwavePower = 350; _drive.TurlRight(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlLeft(); _drive.TurlLeft(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlLeft(); _drive. TurlLeft(); _drive.TurlLeft(); _drive.TurlLeft(); _power.MicrowavePower = 0; _notification.StopNotification(); ) )

To je vse, primer je pripravljen, ostane le še, da ga preizkusimo.

Var pogon = nov pogon(); var power = new Power(); var obvestilo = novo obvestilo(); var microwave = new Microwave.Microwave(pogon, moč, obvestilo); Console.WriteLine("Odmrzni"); mikrovalovna pečica.Odtaljevanje(); Console.WriteLine(); Console.WriteLine("Ogrejmo"); mikrovalovna pečica.Ogrevanje();

Rezultat bo naslednji:


Opis Remote Facade

Zagotavlja skupen vmesnik za poenotenje nabora objektnih metod za izboljšanje učinkovitosti mreženja.

Vzorec oddaljene fasade v objektno usmerjenem modelu izboljša delo z majhnimi predmeti, ki imajo majhne metode. Majhne tehnike ponujajo velike možnosti za nadzor in spreminjanje vedenja ter izboljšanje naročnikovega razumevanja aplikacije. Ena od posledic tega natančnega vedenja je, da med objekti običajno obstaja veliko interakcij z veliko klici metod.

V enem naslovnem prostoru "fino zrnate" interakcije delujejo dobro, vendar se vse spremeni, ko pride do interakcije med procesi. Oddaljeni klici so dražji, ker je treba narediti veliko: včasih je treba podatke organizirati, preveriti varnost, pakete je treba usmeriti na stikala. Če dva procesa delujeta na različnih koncih sveta, lahko celo svetlobna hitrost igra vlogo. Trda resnica je, da je vsaka medprocesna komunikacija za rede velikosti bolj potratna kot klici znotraj procesa. Tudi če se oba procesa izvajata na istem računalniku. Tega vpliva na zmogljivost ne morejo spregledati niti leni navdušenci nad optimizacijo.

Posledično vsak predmet, ki je vključen v oddaljeno delovanje, potrebuje bolj splošen vmesnik, ki zmanjša število zahtev, potrebnih za nekaj. To ne vpliva samo na metode, ampak tudi na predmete. Namesto da zahtevate račun in vse njegove postavke ločeno, morate prebrati in posodobiti vse postavke računa v eni zahtevi. To vpliva na celotno strukturo objekta. Pozabiti moramo na dober namen majhnih predmetov in majhnih metod. Programiranje postaja vse težje, produktivnost pada in pada.

Vzorec oddaljene fasade predstavlja splošno »fasado« (v skladu z GoF) na vrhu strukture bolj »drobnozrnatih« predmetov. Noben od teh objektov nima oddaljenega vmesnika in oddaljena fasada ne vključuje nobene poslovne logike. Vse, kar naredi Remote Facade, je prevajanje splošnih zahtev v nabor majhnih zahtev za podrejene objekte.

Ključno vlogo v arhitekturi, o kateri razpravljamo v tej knjigi, ima oblikovalski vzorec, imenovan fasada.

Praviloma se fasada uporablja za ustvarjanje neke vrste abstrakcije, ki za seboj skriva popolnoma drugačno realnost. Fasadni vzorec zagotavlja priročno vmesnik na visoki ravni za velike bloke kode, ki skrivajo njihovo resnično zapletenost. Zamislite si fasado kot poenostavljen API, ki ga dajete v uporabo drugim razvijalcem.

fasada - strukturni vzorec. Pogosto ga je mogoče najti v knjižnicah in ogrodjih JavaScript, kjer je uporabnikom na voljo le fasada – omejena abstrakcija širokega nabora vedenj, implementiranih interno.

Zahvaljujoč temu pristopu uporabnik komunicira samo z vmesnikom, ne da bi imel pojma o podsistemih, ki se skrivajo za njim.

Razlog, zakaj nas zanima fasada, je zmožnost skrivanja izvedbenih podrobnosti specifične funkcionalnosti, shranjene v modulih. To nam bo omogočilo spreminjanje izvedbe brez obveščanja uporabnikov.

Robustna fasada - naš poenostavljeni vmesnik - nam bo omogočila, da ne bomo skrbeli za tesno povezovanje nekaterih modulov našega sistema z dojo, jQuery, YUI, zepto ali katero koli drugo knjižnico. Postane manj pomembno. Lahko se premikate iz ene knjižnice v drugo, ne da bi spremenili sloj interakcije. Na primer iz jQuery v dojo. Poleg tega imate možnost, da ta prehod opravite pozneje, brez sprememb preostalega sistema.

Spodaj sem napisal dokaj enostaven primer uporabe fasade. Kot lahko vidite, ima naš modul več zasebnih metod. Za ustvarjanje enostavnejšega vmesnika za dostop do teh metod uporabljamo fasado.

var module = (function () ( var _private = ( i : 5 , get : function () ( console . log ( "Trenutna vrednost:"+ tole. jaz); ), set : function (val ) ( this . i = val ; ), run : function () ( console . log ( "proces se je začel"); ), skok : funkcija () ( konzola . dnevnik ( "nagla sprememba"); ) ); return ( fasada : funkcija ( args ) ( _private . set ( args . val ); _private . get (); if ( args . run ) ( _private . run (); ) ) )()); modul. fasada (( run : true , val : 10 )); // Trenutna vrednost: 10, proces teče

To je razlog, da smo naši arhitekturi dodali fasado. V naslednjem poglavju bomo razpravljali o mediatorju. Temeljna razlika med tema dvema vzorcema je v tem, da fasada kot konstrukcijski vzorec zgolj prenaša obstoječo funkcionalnost na mediator, medtem ko lahko mediator kot vedenjski vzorec to funkcionalnost razširi.

Pred branjem preglejte naslednje konvencije in koncepte. Ta članek se do neke mere posodablja, tako da, če ste ga že prebrali, ni dejstvo, da se podatki niso spremenili.

Fasada spadajo v razred strukturno vzorcev. Predstavlja enoten vmesnik namesto nabora vmesnikov določenega podsistema. Vzorec fasade določa vmesnik višje ravni, ki olajša uporabo podsistemov.

Razdelitev kompleksnega sistema na podsisteme vam omogoča poenostavitev procesa načrtovanja in pomaga zmanjšati odvisnost enega podsistema od drugega. Vendar to vodi k dejstvu, da uporaba takih podsistemov skupaj postane precej težavna. Eden od načinov za rešitev te težave je uvedba fasadnega vzorca.

To je eden tistih vzorcev, ki nima jasne izvedbe, saj je odvisen od posameznega sistema. Na splošno moramo izvesti naslednjo transformacijo:

Sivi pravokotnik vsebuje naše podsisteme, ki imajo med seboj nekaj odvisnosti (lahko tudi ne). Zgornji trije bloki označujejo tri odseke kode odjemalca, v katerih je v interakciji s tem podsistemom. Naša naloga je narediti preprost, enoten vmesnik, preko katerega bi bilo dovolj interakcije s podsistemi v okviru naloge, tiste. ni nam treba izdelati univerzalnega vmesnika za vse priložnosti, saj je v večini primerov to nepotrebno in vodi v kompleksnejše interakcije in daljši razvojni čas.

Spodaj je skica ene izvedbe:

/** * SystemA */ class Bank ( javna funkcija OpenTransaction() () javna funkcija CloseTransaction() () javna funkcija transferMoney($amount) () ) /** * SystemB */ class Client ( javna funkcija OpenTransaction() ( ) javna funkcija CloseTransaction() () javna funkcija transferMoney($amount) () ) /** * SystemC */ class Log ( javna funkcija logTransaction() () ) class Facade ( javna funkcija transfer($amount) ( $Bank = nova banka(); $Client = nova stranka(); $Log = novi dnevnik(); $Bank->OpenTransaction(); $Client->OpenTransaction(); $Log->logTransaction("Odprta transakcija"); $ Banka->transferMoney(-$znesek); $Log->logTransaction("Prenos denarja iz banke"); $Client->transferMoney($znesek); $Log->logTransaction("Prenos denarja stranki"); $Bank ->CloseTransaction(); $Client->CloseTransaction(); $Log->logTransaction("Transaction close"); ) ) // Koda odjemalca $Transfer = new Facade(); $Transfer->transfer(1000);