
interface IStrategy {
doOperation(a: number, b: number): number
}
//ConcreteStrategy
class AddStrategy {
doOperation(a: number, b: number) {
return a + b
}
}
//ConcreteStrategy
class SubstractStrategy {
doOperation(a: number, b: number) {
return a - b
}
}
//Context
class Calc {
private strategy: IStrategy = undefined
execute(a: number, b: number) {
if (this.strategy == undefined)
return 0
return this.strategy.doOperation(a, b)
}
setStrategy(strategy: IStrategy) {
this.strategy = strategy
}
}
let calc = new Calc()
let result1 = calc.execute(5, 3)
//result1 is 0
calc.setStrategy(new AddStrategy())
let result2 = calc.execute(5, 3)
//result2 is 8
calc.setStrategy(new SubstractStrategy())
let result3 = calc.execute(5, 3)
//result3 is 2
console.log(`result1 is ${result1}`)
console.log(`result2 is ${result2}`)
console.log(`result3 is ${result3}`)
| Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. |