všetky vzory

Proxy

Postaví pred objekt zástupcu, ktorý prístup k nemu riadi alebo odkladá.

class Image {  draw() { throw new Error('abstraktná metóda'); }} class RealImage extends Image {  constructor(path) {    super();    // Expensive: reads the whole file from disk.    this.data = load(path);  }   draw() {    // draws the loaded data  }} class ImageProxy extends Image {  constructor(path) {    super();    this.path = path;    this.real = null;  }   draw() {    if (this.real === null) {      this.real = new RealImage(this.path);    }    this.real.draw();  }} const image = new ImageProxy('map.png');image.draw();   // only now is it read from diskimage.draw();   // the second time nothing is read

Celý priebeh v texte (10 krokov)
  1. Image je abstraktný a dedia ho obaja: zástupca aj skutočný obraz. Práve preto klient nespozná, s ktorým z nich hovorí — a preto sa dá jeden nahradiť druhým.
  2. Klient drží zástupcu a myslí si, že drží obraz. Skutočný obraz zatiaľ neexistuje — komora zástupcu je prázdna a z disku sa nenačítalo nič.
  3. Klient zavolá draw().
  4. Zástupca zistí, že skutočný obraz ešte nemá — a až teraz ho vytvorí. Načítanie z disku sa odložilo presne na chvíľu, keď je naozaj potrebné.
  5. A až potom pošle volanie ďalej.
  6. Klient zavolá draw() druhýkrát. To isté volanie, ten istý objekt v ruke.
  7. Tentoraz zástupca nič nevytvára — skutočný obraz už má, tak volanie iba posunie ďalej. Cena za načítanie sa zaplatila raz.
  8. A teraz to, čo zástupcu odlišuje od všetkého ostatného. Klient zavolá tretíkrát — lenže tentoraz nemá právo.
  9. Volanie sa zastaví u zástupcu a ďalej nejde. Skutočný obraz sa o ňom nikdy nedozvie — zástupca prístup riadi, nie iba sprostredkúva.
  10. Klient celý čas volal to isté a ani raz sa nedozvedel, či hovorí so zástupcom alebo so skutočným obrazom. A tu je rozdiel oproti dekorátoru: zástupca nič nepridal, iba rozhodol, čo prejde ďalej a kedy.

Kedy použiť

  • Drahý objekt možno nikto nepoužije — zástupca ho vytvorí až pri prvom volaní.
  • Zástupca skontroluje právo skôr, než volanie pustí ďalej, a rozhranie zostáva rovnaké.
  • Objekt je inde a zástupca schová celú sieťovú komunikáciu za obyčajné volanie.
  • Evidencia, počítanie odkazov či cache do skutočného objektu nepatria, ale niekto ich robiť musí.

Pasce

  • Zamieňa sa s Decoratorom. Dekorátor správanie pridáva a vrství sa, zástupca ho riadi a býva jeden.
  • Zamieňa sa s delegovaním. Kto deleguje, má vlastné rozhranie; zástupca sa vydáva za zastupovaného.
  • Zástupca musí byť zameniteľný — kto inak ohlási chybu či porovná identitu, skryte mení správanie.
  • Odložené vytvorenie presunie cenu inam: prvé volanie zrazu siahne na disk alebo na sieť.
  • Sieťový zástupca vyzerá ako obyčajná metóda a volajúci ju pokojne zavolá v cykle tisíckrát.
  • Kto si vypýta skutočný objekt priamo, obíde kontrolu prístupu aj cache.