Strategy Pattern

  • Sprouting
  • c.

The strategy pattern is a behavioral design pattern for allowing contextual pieces of logic to be used interchangeably.

Example

Real-world analogy: requesting an airport transfer

design-patterns/src/behavioral/strategy.ts on main

Strategy

Based on budget and time constraints, different airport transfer methods can be requested. A metro transfer is slow but cheap, a taxi transfer is fast but expensive.

type TransferRequester = () => { cost: string; duration: number };
const busRequester: TransferRequester = () => ({ cost: "$$", duration: 20 });
const metroRequester: TransferRequester = () => ({ cost: "$", duration: 30 });
const taxiRequester: TransferRequester = () => ({ cost: "$$$", duration: 10 });

Context

The transfer requester is interchangable. When the airport transfer is requested, the transfer request is delegated to the specific requester.

class AirportTransfer {
private requester: TransferRequester;
constructor(requester: TransferRequester) {
this.requester = requester;
}
requestTransfer() {
const { cost, duration } = this.requester();
console.log(`Transfer cost: ${cost}, duration: ${duration}m`);
}
setRequester(requester: TransferRequester) {
this.requester = requester;
}
}

Client

The airport transfer can be requested using any type of transfer requester. Calling the airport transfer’s requestTransfer method uses whatever transfer requester has been assigned to it.

const transfer = new AirportTransfer(busRequester);
transfer.requestTransfer();
// Expected output:
// Transfer cost: $$, duration: 20m
transfer.setRequester(metroRequester);
transfer.requestTransfer();
// Expected output:
// Transfer cost: $, duration: 30m
transfer.setRequester(taxiRequester);
transfer.requestTransfer();
// Expected output:
// Transfer cost: $$$, duration: 10m

Backlinks