Oddelí abstrakciu od implementácie, aby sa dali meniť nezávisle.
class Kanal { posli(text) { throw new Error('abstraktná metóda'); }} class EmailKanal extends Kanal { posli(text) { // cez SMTP }} class SmsKanal extends Kanal { posli(text) { // cez bránu operátora }} class Sprava { constructor(kanal) { this.kanal = kanal; } odosli(text) { throw new Error('abstraktná metóda'); }} class BeznaSprava extends Sprava { odosli(text) { this.kanal.posli(text); }} class UrgentnaSprava extends Sprava { odosli(text) { this.kanal.posli('POZOR: ' + text); }} const a = new BeznaSprava(new EmailKanal());const b = new BeznaSprava(new SmsKanal());const c = new UrgentnaSprava(new EmailKanal());