← Back to scenarios
ScenarioCatalog DB

Remote control bridge

Control TVs, speakers, and streaming devices through interchangeable device implementations.

Problem

A remote-control interface must operate different device implementations without embedding device-specific behavior in the control abstraction.

Related patterns

Implementations

Bridge

TypeScriptApplication

Bridge in TypeScript

Separates remote-control behavior from device implementations so remotes and devices can evolve independently.

TypeScript
interface Device {
  enable(): void;
  disable(): void;
  isEnabled(): boolean;
  setVolume(percent: number): void;
}

class Television implements Device {
  private enabled = false;

  enable() {
    this.enabled = true;
  }

  disable() {
    this.enabled = false;
  }

  isEnabled() {
    return this.enabled;
  }

  setVolume(percent: number) {
    console.log(`TV volume set to ${percent}%`);
  }
}

class Speaker implements Device {
  private enabled = false;

  enable() {
    this.enabled = true;
  }

  disable() {
    this.enabled = false;
  }

  isEnabled() {
    return this.enabled;
  }

  setVolume(percent: number) {
    console.log(`Speaker volume set to ${percent}%`);
  }
}

class RemoteControl {
  constructor(protected readonly device: Device) {}

  togglePower() {
    if (this.device.isEnabled()) {
      this.device.disable();
    } else {
      this.device.enable();
    }
  }
}

class VolumeRemoteControl extends RemoteControl {
  volumeUp() {
    this.device.setVolume(70);
  }
}

const remote = new VolumeRemoteControl(new Speaker());

remote.togglePower();
remote.volumeUp();

Associated technologies