策略模式(Strategy Pattern)

策略模式,我觉得是状态模式的一种升级或衍生版本,策略模式更倾向于运算或策略,而状态模式更倾向于状态。

策略模式的实例

首先定义几种不同的策略

  1. class OperationAdd {
  2. doOperation(num1, num2) {
  3. return num1 + num2;
  4. }
  5. }
  6. class OperationSubstract {
  7. doOperation(num1, num2) {
  8. return num1 - num2;
  9. }
  10. }
  11. class OperationMultiply {
  12. doOperation(num1, num2) {
  13. return num1 * num2;
  14. }
  15. }

最后定义根据策略来变更行为的上下文

  1. class Context {
  2. constructor(strategy){
  3. this.strategy = strategy;
  4. }
  5. executeStrategy(num1, num2){
  6. return this.strategy.doOperation(num1, num2);
  7. }
  8. }

那么根据策略的不同改变了上下文执行的行为

  1. let context = new Context(new OperationAdd());
  2. console.log("10 + 5 = " + context.executeStrategy(10, 5));
  3. context = new Context(new OperationSubstract());
  4. console.log("10 - 5 = " + context.executeStrategy(10, 5));
  5. context = new Context(new OperationMultiply());
  6. console.log("10 * 5 = " + context.executeStrategy(10, 5));
  7. /**
  8. * output:
  9. * 10 + 5 = 15
  10. * 10 - 5 = 5
  11. * 10 * 5 = 50
  12. */

策略模式的优势

策略和策略之间实现解耦,和状态模式类似可以通过此来消除一些if…else语句。

上一页(空对象模式)

下一页(模板模式)