Pridá operáciu nad štruktúrou objektov bez zásahu do ich tried.
class Prvok { prijmi(navstevnik) { throw new Error('abstraktná metóda'); }} class Kruh extends Prvok { constructor(r) { super(); this.r = r; } // Kruh operáciu nevykoná. Odovzdá riadenie a podá seba. prijmi(navstevnik) { navstevnik.navstivKruh(this); }} class Stvorec extends Prvok { constructor(a) { super(); this.a = a; } prijmi(navstevnik) { navstevnik.navstivStvorec(this); }} class Navstevnik { navstivKruh(kruh) { throw new Error('abstraktná metóda'); } navstivStvorec(stvorec) { throw new Error('abstraktná metóda'); }} class PlochaVypocet extends Navstevnik { navstivKruh(kruh) { return Math.PI * kruh.r * kruh.r; } navstivStvorec(stvorec) { return stvorec.a * stvorec.a; }} const plocha = new PlochaVypocet();kruh.prijmi(plocha);stvorec.prijmi(plocha);