Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Proxy (zástupca)

Návrhový vzor Proxy sa hodí hneď v niekoľkých prípadoch. Jeho asi najčastejšie použitie je zapuzdrenie inštancie iného objektu alebo pridanie pomocné funkčnosti. Proxy nám teda umožňuje riadiť prístup či už k celému či čiastočnému rozhranie objektu cez nejaký iný zastupujúci objekt (proxy - zástupca, reprezentant).

Motivácia

Určite sme sa už všetci stretli (alebo sa určite niekedy stretneme) s prípadom, kedy chceme riadiť prístup k nejakému objektu. Či už čisto kvôli bezpečnosti alebo kvôli pridanie ďalšej funkcionality, zefektívnenie či zjednodušenie ladenia aplikácie atď. Vo všetkých týchto prípadoch sa nám najskôr bude hodiť tento návrhový vzor.

Návrhový vzor

Aby sme plne pochopili, kde a na čo sa návrhový vzor Proxy (Zástupca) používa, uvedieme si niekoľko typických variantov vzoru Proxy riešiacich rôzne situácie. Tieto varianty sú tiež uvedené v GoF.

Remote Proxy (vzdialený zástupcu)

Ak by sme chceli komunikovať s objektom, ale na inom virtuálnom stroji, prípadne na úplne inom počítači, môžeme využiť práve Remote Proxy. Jedná sa o zástupcov vzdialeného objektu, v ktorom je skrytá všetka komunikácia.

Vzdialený zástupca zastupuje objekt umiestnený niekde inde. Jeho úlohou je sprostredkovať komunikáciu s týmto objektom tak, aby cez Remote Proxy mohli užívatelia komunikovať so vzdialeným (originálnym) objektom bez toho aby sa museli starať o serverovú komunikácii (tú musí zariadiť Proxy objekt). Zároveň však nesmie zakrývať komunikáciu. Tj. napríklad pri zlyhaní spojenia musí vyhodiť zodpovedajúce výnimku s ktorou musí užívateľ počítať a prípadne ju vhodne spracovať. Užívateľ tak môže so vzdialeným zástupcom komunikovať skoro ako s normálnym objektom.

Samotná implementácia Vzdialeného zástupcu sa dá realizovať rôzne. Je trochu náročnejší, pretože musíme zaistiť už spomínanú komunikáciu medzi dvoma objektmi. Vždy však musíme pri implementácii počítať s možnými zlyhaniami komunikácie so vzdialeným objektom.

Virtual Proxy (virtuálne zástupcu)

Častý prípad využitia Proxy je virtuálna zástupca. V našej aplikácii sa môže veľmi často stať, že máme nejaký objekt, ktorého vytváranie alebo prípadná správa by bola náročná príp. by trvalo dlho a bolo by neefektívne načítavať ho celý, keď potom použijeme len jeho časť. Virtuálne zástupca sa snaží vytvoriť inštanciu spravované triedy až keď je to potrebné.

Virtual Proxy sa nám aj v tomto prípade stará o iný objekt (zastupuje ho). Vytvorenie objektu ale prenecháva až na poslednú chvíľu (ak ho vôbec potrebujeme vytvoriť) a správanie objektu len predstiera. Tj. navonok môže mať rovnaké rozhranie, ale funkčnosť len deleguje na originálny objekt, prípadne pridáva nejakú ďalšiu funkčnosť a k zastúpenému objektu pristupuje či ho vytvorí len vtedy, ak je to naozaj nutné. Typicky sa môže jednať o nejaký obrázok. Jeho vykreslenie bude potrebné napríklad len raz alebo vôbec. Naša aplikácia sa ale spýta na jeho rozmery alebo na ďalšie metadáta (napríklad aj v prípade, že ho neskôr vôbec nevykreslí). Bolo by neefektívne načítať obrázok do pamäti, keď ho potom ani nevyužijeme. Ďalším veľmi častým príkladom sú náročnejšie operácie. Typicky objekty načítající dáta z databázy. Aplikácia nemusí ani zďaleka využiť všetky dáta z daného úložiska. Môžeme definovať Proxy triedu (Virtuálneho zástupcu), ktorá bude načítať a vytvárať príslušný objekt, až keď bude skutočne potrebné, načítavať len danú časť, s ktorou práve pracujeme, zapisovať jeho výsledky do cache, aby sme ich nemuseli načítavať stále znovu atď.

Virtual Proxy – virtuálny zástupca - GOF - Vzory štruktúry

Virtual Proxy - virtuálny zástupca

Protection Proxy (ochranný zástupcu)

V návrhu aplikácie sa môžeme niekedy stretnúť s prípadom, keď by využitie celého API (verejného rozhrania) objektu mohlo mať fatálne dôsledky. Pre príklad to môže byť napríklad situácia, kedy každý objekt má k nášmu kľúčovému objektu iná prístupové práva alebo proste len potrebujeme zjednodušiť rozhranie objektu, aby ho niekto neznalý nášho systému nepoužil zle, čo by mohlo mať v niektorých prípadoch dokonca fatálne následky.

V oboch vyššie uvedených prípadoch si definujeme novú Proxy triedu, ktorá si spravuje inštanciu objektu, ale navonok ponúka len podmnožinu metód objektu, ktorý zastupuje. Môžeme tak ovplyvniť, ku ktorým metódam cieľového objektu bude mať užívateľ prístup a ku ktorým nie. V niektorých prípadoch, kedy nám ide len o obmedzenie rozhranie, ho možno nahradiť jednoduchým rozhraním, čo je efektívnejšie, ale zároveň menej bezpečné. Užívateľ má v tomto prípade stále prístup k celému objektu iba pod zjednodušeným rozhraním. Môže si tak celkom jednoducho zistiť, o aký objekt ide.

Smart Reference (šikovný odkaz)

Ak chceme doplniť komunikáciu s objektom o nejaké ďalšie akcie vhodné potrebné pre zefektívnenie a zrýchlenie celého chodu aplikácie, je Šikovný odkaz (smart referencie) ten návrhový vzor, ktorý hľadáme.

Typicky sa používa pre uloženie trvalého (perzistentnej) objektu do pamäte. Takýto objekt potom môžeme chytro uchovať medzi jednotlivými požiadavkami na našu aplikáciu práve pre zefektívnenie či zrýchlenie aplikácie. Taký šikovný zástupca si napr. Môže po vykonaní požiadavke nastaviť limit, po ktorom sa ukončí spojenie so vzdialeným serverom alebo sa vymaže z pamäte. Ak sa po daný limit nepripojí žiaden klient, šikovný odkaz sa pri ďalšom pripojení načíta jednoducho znovu do pamäte alebo znovu otvorí pripojenie k vzdialenému serveru. Toho sa využíva napríklad pri uchovávaní spojenie s databázou alebo s iným vzdialeným serverom.

Ako šikovný odkaz sa chová tiež každý virtuálny zástupcu, ktorý sme si vysvetlili vyššie. Ten sa totiž tiež musí sám rozhodovať, kedy pristúpi k originálnemu objektu a kedy si naopak pomôže sám (napr načíta hodnoty z cache, zistí iba metadáta miesto načítanie celého média atď.)

Záverom

Návrhový vzor Proxy patrí medzi návrhové vzory uvedené v GoF. Ide teda o "pravý" návrhový vzor. Väčšinou sa používa pre zapuzdrenie aplikácie, ale možno ho použiť aj pre zlepšenie funkčnosti (napr. Zefektívnenie, zrýchlenie aplikácie atď.). Rozlišujeme štyri zástupca: vzdialený zástupcu (remote proxy), virtuálne zástupca (virtual proxy), ochranný zástupca (protected proxy) a šikovný odkaz (smart referencie).


 

Všetky články v sekcii
GOF - Vzory štruktúry
Článok pre vás napísal Drahomír Hanák
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor v současné době studuje Informatiku. Zajímá se o programování, matematiku a grafiku.
Aktivity