Skip to main content

Strategy

Overview​

Define a family of algorithms and make them interchangeable.

When to use​

  • You need runtime selection of behavior.
  • You want to avoid large switch statements.

Java example​

interface PricingStrategy {
int price(int base);
}

class DiscountStrategy implements PricingStrategy {
public int price(int base) {
return base - 10;
}
}

class PricingService {
private PricingStrategy strategy;

PricingService(PricingStrategy strategy) {
this.strategy = strategy;
}

void setStrategy(PricingStrategy strategy) {
this.strategy = strategy;
}

int compute(int base) {
return strategy.price(base);
}
}

TypeScript example​

type PricingStrategy = (base: number) => number;

const discount: PricingStrategy = (base) => base - 10;
const premium: PricingStrategy = (base) => base + 25;

class PricingService {
constructor(private strategy: PricingStrategy) {}

setStrategy(strategy: PricingStrategy): void {
this.strategy = strategy;
}

compute(base: number): number {
return this.strategy(base);
}
}

Pros and cons​

Pros:

  • Replaces complex conditional logic.
  • Easy to add new strategies.

Cons:

  • More classes or functions to manage.
  • Clients must choose a strategy.

Common pitfalls​

  • Strategies with overlapping responsibilities.
  • Hard-coded strategy selection in many places.