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