Javascript:设计模式-策略模式

//场景设定: 员工等级分为ABC级,根据不通等级传入基础工资 = 年终奖

var calculate = function(Level, money) {
  let num
  if (Level === 'A') {
    num = money * 4
  else if (Level === 'B') {
    num = money * 3
  else if (Level === 'C') {
    num = money * 2
  }
}
calculate('B', 20000)



// 重构一下

var performanceC = function(money) {
  return money * 2
}
 
var performanceA = function(money) {
  return money * 4
}
 
var performanceB = function(money) {
  return money * 3
}
var calculate = function(Level, money) {
  if (Level === 'A') {
    return performanceA(money)
  else if (Level === 'B') {
    return performanceB(money)
  else if (Level === 'C') {
    return performanceC(money)
  }
}


// 组合函数重构:可以一目了然地知道它对应着哪种算法,它们也可以被复用在程序的其他地方。


// 公司扩张了,每个部门年终奖分为了10个等级

let num
if (level === 'A') {
  num = money * 4
else if (level === 'B') {
  num = money * 3
else if (level === 'C') {
  num = money * 2
else if (level === 'D') {
  num = money * 2
else if (level === 'E') {
  num = money * 2
else if (level === 'F') {
  num = money * 2
else if (level === 'G') {
  num = money * 2
else if (level === 'H') {
  num = money * 2
else if (level === 'I') {
  num = money * 2
else if (level === 'J') {
  num = money * 2
}
// else if.....



// JS毕竟是面向对象语言,封装成对象,等级变为Key值,
// 策略模式:strategy对象从各个策略类中创建而来,这是模拟一些传统面向对象语言的实现。
// 实际上在JavaScript语言中,函数也是对象,所以更简单和直接的做法是把strategy直接定义为函数


// 做什么(策略对象算法)

const strategies = {
  C: function(money) {
    return money * 2
  },
  A: function(money) {
    return money * 4
  },
  B: function(money) {
    return money * 3
  }
}


// 谁去做(策略对象)

const calculate = function(level, money) {
  // 返回不同计算结果,这正是多态的体现
  return strategies[level](money)
}
// 对对象发出计算请求
calculate('C', 20000)
calculate('A', 6000)



// 策略模式的优缺点
// 策略模式是一种常用且有效的设计模式,我们可以总结出策略模式的一些优点。
// 策略模式利用组合、委托和多态(将做什么和谁去做分离开,也就是将不变的事与可能变得事分离开)等技术和思想,
// 可以有效地避免多重条件选择语句,让程序看起来是可生长的。
// 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解,易于扩展。
// 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。

// 要使用策略模式,必须了解所有的strategy,
// 必须了解各个strategy之间的不同点,这样才能选择一个合适的strategy。
// 比如,我们要选择一种合适的旅游出行路线,必须先了解选择飞机、火车、自行车等方案的细节。
// 此时strategy要向客户暴露它的所有实现,这是违反最少知识原则的。

// 除了策略模式还有很多其他的设计模式
// 单例,代理,迭代器,订阅者,命令模式等...
// 订阅者模式多提一句
// 像咱们用的Vue2.0,就是用的Object.defineProperty(),来劫持发布消息给订阅者,触发相应监听回调
// 知道了这个以后就能知道为什么Vue数组下标来设置值老是不能实时响应
// 感兴趣可以看一下他具体实现方法而Vue3.0则改为了Proxy代理,效率更高更简洁

 

 

参考:JavaScript设计模式与开发实践.pdf

posted on 2022-08-25 09:52  紫叶嵋  阅读(17)  评论(0编辑  收藏  举报