复杂判断使用策略模式

2023/11/30

请看如下函数,testFn 函数接受两个类型参数,他们来自各自的 Map,现要求在函数内不同的类型实现不同的逻辑。

// 类型枚举1
const TYPE1_MAP = {
  node: 'node',
  task: 'task'
}

// 类型枚举2
const TYPE2_MAP = {
  material: 'material', 
  project: 'project'
}

function testFn(type1, type2) {}

根据现有的数据看,两两组合一共有四种可能。

// 类型枚举1
const TYPE1_MAP = {
  node: 'node',
  task: 'task'
}

// 类型枚举2
const TYPE2_MAP = {
  material: 'material', 
  project: 'project'
}

function testFn(type1, type2) {
  if (type1 === TYPE1_MAP.node && type2 === TYPE2_MAP.material) {
    console.log('node material')
  }
  if (type1 === TYPE1_MAP.node && type2 === TYPE2_MAP.project) {
    console.log('node project')
  }
  if (type1 === TYPE1_MAP.task && type2 === TYPE2_MAP.material) {
    console.log('task material')
  }
  if (type1 === TYPE1_MAP.task && type2 === TYPE2_MAP.project) {
    console.log('task project')
  }
}

这种实现显然很麻烦,我们用策略模式来改造一下。

// 类型枚举1
const TYPE1_MAP = {
  node: 'node',
  task: 'task'
}

// 类型枚举2
const TYPE2_MAP = {
  material: 'material', 
  project: 'project'
}

// 定义策略对象
const strategy = {
    type: '',
    [`${TYPE1_MAP.node}${TYPE2_MAP.material}`]() {
      console.log('node material')
    },
    [`${TYPE1_MAP.node}${TYPE2_MAP.project}`]() {
      console.log('node project')
    },
    [`${TYPE1_MAP.task}${TYPE2_MAP.material}`]() {
      console.log('task material')
    },
    [`${TYPE1_MAP.task}${TYPE2_MAP.project}`]() {
      console.log('task project')
    },
}

function testFn(type1, type2) {
   strategy.type = `${type1}${type2}`
   strategy[strategy.type]()
}

这样实现可以让你忽略判断给你带来的烦恼,你只需要在每个策略方法里实现你自己逻辑就行。在实际开发中不要照搬硬套示例代码,要灵活运用,相信会给你带来效率提升的!

Last Updated: 2023/11/30 下午5:50:03