Oddelí abstrakciu od implementácie, aby sa dali meniť nezávisle.
class Channel { send(text) { throw new Error('abstraktná metóda'); }} class EmailChannel extends Channel { send(text) { // over SMTP }} class SmsChannel extends Channel { send(text) { // through the carrier gateway }} class Message { constructor(channel) { this.channel = channel; } dispatch(text) { throw new Error('abstraktná metóda'); }} class PlainMessage extends Message { dispatch(text) { this.channel.send(text); }} class UrgentMessage extends Message { dispatch(text) { this.channel.send('ALERT: ' + text); }} const a = new PlainMessage(new EmailChannel());const b = new PlainMessage(new SmsChannel());const c = new UrgentMessage(new EmailChannel());