všetky vzory

Twin

Nahradí viacnásobné dedenie párom objektov, ktoré sa navzájom držia.

class Body {  move(dx, dy) { throw new Error('abstraktná metóda'); }} class Widget {  redraw() { throw new Error('abstraktná metóda'); }} // First half: belongs to the world of physics.class BallBody extends Body {  constructor() {    super();    this.twin = null;  }   move(dx, dy) {    this.x += dx;    this.y += dy;    this.twin.redraw();  }} // Second half: belongs to the world of drawing.class BallWidget extends Widget {  constructor() {    super();    this.twin = null;  }   redraw() {    drawCircle(this.twin.x, this.twin.y);  }} const body = new BallBody();const widget = new BallWidget(); body.twin = widget;widget.twin = body;

Celý priebeh v texte (8 krokov)
  1. Lopta má byť dve veci naraz: teleso vo svete fyziky a widget vo svete kreslenia. Oba svety žiadajú, aby sa dedilo z ich základnej triedy — a jazyk dovolí dediť len z jednej.
  2. Vzor ju preto rozdelí na dvojicu. Prvá polovica dedí z Body a o kreslení nevie nič.
  3. Druhá dedí z Widgetu a nevie nič o fyzike. Sú to dva objekty dvoch rôznych tried, každý vo svojej hierarchii.
  4. A tu je vzor: držia sa navzájom. Nie jedna druhú, ale obe navzájom — lanká vedú oboma smermi a práve to z dvoch objektov robí jednu vec.
  5. Fyzika posunie loptu. Volá polovicu, ktorá je teleso — o tej druhej nevie a ani nemusí.
  6. Tá si zmenu spraví u seba a povie o nej svojmu dvojčaťu. Bez toho odkazu by sa to nemalo ako dozvedieť.
  7. Widget sa prekreslí na novej pozícii — a tú si vypýta od dvojčaťa, lebo sám ju nemá. Do sveta fyziky pritom nikdy nevstúpil.
  8. Navonok jedna lopta, vnútri dvojica. Každá polovica sedí vo svojom svete a ani jeden z tých svetov sa nemusel meniť. Cena je v tom lanku: polovice o sebe musia vedieť po celý život a nesmú sa rozísť — kto zruší jednu, musí zrušiť aj druhú.

Kedy použiť

  • Objekt musí patriť do dvoch hierarchií a jazyk viacnásobné dedenie nemá.
  • Dva rámce žiadajú dedenie zo svojej základnej triedy — každá polovica sa prihlási do svojho.
  • Delegovanie nestačí, lebo rámec žiada svoj typ, nie len správanie.
  • Jedna vec má dve role s vlastným stavom; každá polovica si drží svoje.

Pasce

  • Dvojica musí žiť a zaniknúť spolu — zrušená polovica nechá druhej odkaz do prázdna.
  • Navonok to nie je jedna vec: volajúci musí vedieť, ktorú polovicu drží.
  • Polovice sa držia navzájom, takže cyklus nemá kto uvoľniť.
  • Keď obe polovice vedú vlastnú kópiu polohy, raz sa rozídu a nikto nevie, ktorá platí.
  • Je to náhrada za chýbajúce viacnásobné dedenie, nie návrhový zámer.
  • Zamieňa sa s delegovaním: tam je pomocník súkromný a jednostranný, tu sú polovice rovnocenné.