Diagrama

Para aplicar esto utilizarémos un contexto de un sistema de calculadora.
Interface Strategy
Esta interface nos permitirá seguir la misma regla en todas nuestrás clases.
export interface OperationStrategy { execute(a: number, b: number): number}Clases concretas
Las clases concretas son las que implementarán nuestra interface aplicando el método execute
Operación de suma
export class OperationAdd implements OperationStrategy { execute(a: number, b: number): number { return a + b }}Operación de resta
export class OperationSubstract implements OperationStrategy { execute(a: number, b: number): number { return a - b }}Operación de multiplicación
export class OperationMultiply implements OperationStrategy { execute(a: number, b: number): number { return a * b }}Context
El contexto se podría defininir como el caso de uso.
La clase Calculator es quien usa las implementacíones pero sin saber que es lo que está sucediendo en cada clase de operación, Esto permite tener un código más estructurado, mantenible y desacoplado.
export class Calculador { private operation: OperationStrategy constructor(operation: OperationStrategy) { this.operation = operation } changeStrategy(operation: OperationStrategy) { this.operation = operation } calculate(a: number, b: number) { return this.operation.execute(a, b) }}Uso
const calculator = new Calculador(new OperationAdd())const result = calculator.calculate(10, 5)calculator.changeStrategy(new OperationSubstract())const result1 = calculator.calculate(10, 5)calculator.changeStrategy(new OperationMultiply())const result2 = calculator.calculate(10, 5)console.log(result) // 15console.log(result1) // 5console.log(result2) // 50