ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
SP
patterns · 2 min read

strategy pattern

The strategy pattern is a behavioral design pattern that allows you to define a family of algorithms, encapsulate each one as an object, and make them…

The strategy pattern is a behavioral design pattern that allows you to define a family of algorithms, encapsulate each one as an object, and make them interchangeable at runtime. In the context of an APIary platform, this means being able to swap out different authentication strategies, sorting strategies, or billing strategies without modifying the core code.

Problem

Imagine you're building an e-commerce platform with an APIary backend. You want to support multiple payment gateways (e.g., PayPal, Stripe, Bank Transfer) and allow users to switch between them seamlessly. However, each gateway has its own authentication process, which can be complex and error-prone if implemented directly in the core code.

Solution

The strategy pattern provides a solution by introducing an interface (PaymentGatewayStrategy) that defines the common behavior for all payment gateways:

interface PaymentGatewayStrategy {
  authenticate(user: User): boolean;
  charge(amount: number, user: User): void;
}

Each payment gateway is then implemented as a concrete strategy class (e.g., PayPalStrategy, StripeStrategy) that implements the PaymentGatewayStrategy interface:

class PayPalStrategy implements PaymentGatewayStrategy {
  authenticate(user: User): boolean {
    // implement PayPal-specific authentication logic
  }

  charge(amount: number, user: User): void {
    // implement PayPal-specific charging logic
  }
}

class StripeStrategy implements PaymentGatewayStrategy {
  authenticate(user: User): boolean {
    // implement Stripe-specific authentication logic
  }

  charge(amount: number, user: User): void {
    // implement Stripe-specific charging logic
  }
}

In the core code, you can then use a factory method to create an instance of the desired payment gateway strategy:

class PaymentGatewayFactory {
  static createStrategy(gatewayName: string): PaymentGatewayStrategy {
    if (gatewayName === 'PayPal') return new PayPalStrategy();
    if (gatewayName === 'Stripe') return new StripeStrategy();
    // ...
  }
}

Finally, you can inject the chosen strategy into your business logic:

class CheckoutService {
  private paymentGateway: PaymentGatewayStrategy;

  constructor(paymentGateway: PaymentGatewayStrategy) {
    this.paymentGateway = paymentGateway;
  }

  processPayment(amount: number, user: User): void {
    this.paymentGateway.charge(amount, user);
  }
}

Benefits

The strategy pattern provides several benefits:

  • Decoupling: The core code is decoupled from the specific implementation details of each payment gateway.
  • Flexibility: New payment gateways can be added without modifying the core code.
  • Extensibility: The strategy pattern makes it easy to add new features or behaviors by introducing new strategies.

Real-World Examples

The strategy pattern is used extensively in various domains, including:

  • Authorization and Authentication: Different auth strategies (e.g., OAuth, JWT) can be swapped out at runtime.
  • Sorting and Filtering: Various sorting algorithms (e.g., bubble sort, quicksort) or filtering strategies (e.g., exact match, fuzzy search) can be used depending on the requirements.
  • Billing and Invoicing: Different billing strategies (e.g., flat rate, tiered pricing) can be applied based on customer type or usage patterns.

Conclusion

The strategy pattern is a powerful tool for designing flexible and maintainable software systems. By encapsulating algorithms as objects and making them interchangeable at runtime, you can decouple your code from specific implementation details and focus on the core business logic.

Related/Sources

Frequently asked
What is strategy pattern about?
The strategy pattern is a behavioral design pattern that allows you to define a family of algorithms, encapsulate each one as an object, and make them…
What should you know about problem?
Imagine you're building an e-commerce platform with an APIary backend. You want to support multiple payment gateways (e.g., PayPal, Stripe, Bank Transfer) and allow users to switch between them seamlessly. However, each gateway has its own authentication process, which can be complex and error-prone if implemented…
What should you know about solution?
The strategy pattern provides a solution by introducing an interface ( PaymentGatewayStrategy ) that defines the common behavior for all payment gateways:
What should you know about benefits?
The strategy pattern provides several benefits:
What should you know about real-World Examples?
The strategy pattern is used extensively in various domains, including:
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room