设计模式-策略模式

2019-10-20 10:43:3510/1/2021, 3:34:43 AM

WHAT

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

一个基于策略模式的程序至少由两部分组成,第一部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二部分是环境类 Context,Context 接受客户的请求随后把请求委托给某一个策略类。要做到这一点,说明 Context 中要维持对某个策略类的引用。

WHY

  • 策略模式使用组合、委托和多态等技术和思想,可以避免多重条件选择语句
  • 策略模式提供了对开放-封闭原则的完美支持,将算法封装在独立的 strategy 中,使得它们易于替换、理解、扩展
  • 在策略模式中利用组合和委托让 context 拥有执行算法的能力,这也是继承的一种更轻便的替代方案

HOW

/* 计算奖金:绩效为S有四倍工资,绩效为A有3倍工资,绩效为B有2倍工资 */

// common  缺乏扩展性
function calcBouns(type, salary) {
  if(type === 'S') return salary * 4
  if(type === 'A') return salary * 3
  if(type === 'B') return salary * 2
}
calcBouns('S', 20000)
calcBouns('A', 10000)

// stratety pattern
const strategy {
  S: function(salary) {
    return salary * 4
  },
  A: function(salary) {
    return salary * 3
  },
  B: function(salary) {
    return salary * 2
  }
}

const calcBouns = function(type, salary) {
  return strategy[type](salary)
}

calcBouns('S', 20000)
calcBouns('A', 10000)

// functional programing
function S(salary) {
  return salary * 4
}
function A(salary) {
  return salary * 3
}
function B(salary) {
  return salary * 2
}

function calcBouns(fn, salary) {
  return fn(salary)
}

calcBouns(S, 20000)
calcBouns(B, 10000)