复杂判断使用策略模式
liz-q 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]()
}
这样实现可以让你忽略判断给你带来的烦恼,你只需要在每个策略方法里实现你自己逻辑就行。在实际开发中不要照搬硬套示例代码,要灵活运用,相信会给你带来效率提升的!