← Back to scenarios
ScenarioCatalog DB

Remote control actions

Bind remote-control buttons to commands that trigger device actions without device-specific invoker logic.

Problem

A remote control must invoke interchangeable device actions without knowing the receiver APIs or embedding conditional logic for every supported device.

Related patterns

Implementations

Command

TypeScriptApplication

Command in TypeScript

Encapsulates document actions as objects so an editor can execute, queue, and undo operations without knowing their implementation details.

TypeScript
interface Command {
  execute(): void;
  undo(): void;
}

class Document {
  private content = "";

  append(text: string) {
    this.content += text;
  }

  removeLast(count: number) {
    this.content = this.content.slice(0, -count);
  }

  print() {
    console.log(this.content);
  }
}

class AppendTextCommand implements Command {
  constructor(
    private readonly document: Document,
    private readonly text: string,
  ) {}

  execute() {
    this.document.append(this.text);
  }

  undo() {
    this.document.removeLast(this.text.length);
  }
}

class Editor {
  private readonly history: Command[] = [];

  run(command: Command) {
    command.execute();
    this.history.push(command);
  }

  undo() {
    this.history.pop()?.undo();
  }
}

const document = new Document();
const editor = new Editor();

editor.run(new AppendTextCommand(document, "Hello, "));
editor.run(new AppendTextCommand(document, "world!"));

document.print();

editor.undo();
document.print();

Associated technologies